Python之多线程多进程

时间:2023-02-18 20:12:38

(一)进程

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