1.多线程
1.1多线程创建和启动
进程:一些资源的集合
线程:程序执行的最小单位
线程包含在进程内,进程是由若干线程组成的,一个进程至少有一个线程。
多任务可以由多进程完成,也可以由一个进程内的多线程完成。
启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行,循环创建线程时,应当全部创建完毕后,再循环每一个线程执行t.join,否则和串行效率就一样了,代码示例:
importthreadingimporttimedefrun():
time.sleep(1)print('run.............')
starttime=time.time()
threads=[]for i in range(20):#循环创建20个线程
t1=threading.Thread(target=run,) #实例化一个线程
threads.append(t1)
t1.start()#启动线程#for t in threads:#循环每一个线程并t.join来等待#t.join() #主线程等待子线程执行结束
while threading.active_count()!=1:passendtime=time.time()print(endtime-starttime)
一个多线程下载图片的例子如下
两个知识点:
多线程运行时拿不到函数的返回值,可以定义一个全局变量,把返回值存储到全局变量中
实例化线程时,函数运行的参数可以通过一个list传入,t=threading.Thread(target=download_pic,args=(url,))
importrequestsfrom hashlib importmd5importthreadingimporttime
filename=[]defdownload_pic(url):
r=requests.get(url)
file_name=md5(r.content).hexdigest() #文件内容md5后的字符串拿来当作文件名
with open(file_name+'.jpg','wb')as fw:
fw.write(r.content)
filename.append(file_name)#多线程运行时拿不到函数的返回值,可以定义一个全局变量,把返回值存储到全局变量中
urls=['https://cn.bing.com/az/hprichbg/rb/GoldenEagle_ZH-CN2823955379_1920x1080.jpg','https://cn.bing.com/az/hprichbg/rb/GoldenEagle_ZH-CN2823955379_1920x1080.jpg','https://cn.bing.com/az/hprichbg/rb/Napo