Python之多线程多进程

(一)进程

1、定义

进程:就是一组资源的集合。一个程序就是一个进程。

  • 线程是用来干活的,只有进程的话是没办法运行的,进程里其实是线程在具体干活的。
import threading
import time
def run():
    time.sleep(5)
    print('over')

start_time=time.time()

run()
run()
run()
run()

end_time=time.time()
print('run_time', end_time-start_time)
#结果:run_time=20.38954234234

上面这个例子是单线程执行的,如果使用多线程,则会并行执行,执行结果应该是5s左右。

import threading
import time
def run():
    time.sleep(5)
    print('over')

start_time=time.time()
for i in range(5):
    t=threading.Thread(target=run)  #实例化一个线程
    t.start() #启动这个线程
end_time=time.time()
print('run_time=', end_time-start_time)

 

单线程下载网页

def download_html(url,file_name):
    res=requests.get(url)
    with open(file_name, 'wb') as fw:
        fw.write(res.content)  #由于网页的字符集编码不一致,所以使用wb模式,避免写到文件里时是乱码

urls={
   'nnzhp':'http://ww.nnzhp.cn',
   'cc':'http://www.cc-na.cn',
   'dsx':'http://www.imdsx.cn'    
}

start_time=time.time()
for k,v in urls.items():
        download_html(url=v,file_name=k)
end_time=time.time()
print('run_time=',end_time-start_time)

多线程下载网页

import requests
import threading
def download_html(url,file_name):
    res=requests.get(url)
    with open(file_name+'.html', 'wb') as fw:
        fw.write(res.content)
    print('【%s】下载完成' %file_name)

urls={
    'nnzhp':'http://www.nnzhp.cn',
    'cc':'http://www.cc-na.cn',
    'dsx':'http://www.imdsx.cn'
}

for file_name,url in urls.items():
  t=threading.Thread(target=download_html,args=(url,file_name))   #args是存参数的,如果里面只有一个参数的话,一定要在这个参数后面加一个逗号,因为是保存在元组里,如果不加逗号,它会默认为是字符串   应该写成:args=(url,)
  t.start()
  • 一个进程里面至少有一个线程,这个线程就是主线程。
  • 主线程只是调度用的,它把子线程招来之后就完事了,因此如果要统计运行时间,必须要让主线程等待所有的子线程都执行完后再记录结束时间。

 

posted @ 2018-12-26 20:52  意如柳  阅读(226)  评论(0编辑  收藏  举报