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()
- 一个进程里面至少有一个线程,这个线程就是主线程。
- 主线程只是调度用的,它把子线程招来之后就完事了,因此如果要统计运行时间,必须要让主线程等待所有的子线程都执行完后再记录结束时间。
每天进步一点点,快乐生活多一点。