多线程、多进程
1.进程:
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。进程是很多资源的集合
2.线程:
线程和线程直接都是独立的。
进程里面本身就有一个线程,这个线程叫做主线程。
3.子线程
有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)
#python中的多线程使用theading模块
import threading import requests,time def lajfenlei(): time.sleep(2)#下载文件需要2s print('干垃圾') start_time = time.time() for i in range(10):#主线程 lajfenlei()#子线程 print( time.time() - start_time) #主线程完成后,子线程不一定完成
控制子线程先与主线程完成顺序的两种方法
#第一种方法,主线程等待子线程 threads =[] for i in range(10): syy = threading.Thread(target=lajfenlei,) syy.start() threads.append(syy) for t in threads: t.join()
#加入死循环 for i in range(10): syy = threading.Thread(target=lajfenlei,) syy.start() while True: if threading.activeCount()==1:#子线程都结束后,只剩一个主线程时,结束循环 break end_time = time.time() print(end_time - start_time)
守护线程
类比:秦始皇(线程)--陪葬品(守护线程),待秦始皇驾崩后,陪葬品也陪葬
import time,threading,os import threadpool def lajfenlei(): for i in range(10): syy = threading.Thread(target=lajfenlei,) syy.setDaemon(True) #把子线程设置成守护线程 syy.start() while threading.activeCount() != 1: pass print(count) print('完成!')
锁
import time,threading,os import threadpool count = 0 lock = threading.Lock() #申请一把锁 def lajfenlei(): global count # lock.acquire()#修改前加锁,修改后释放锁 # count += 1 # lock.release()#解锁 with lock: count+=1 print('干垃圾') for i in range(10): syy = threading.Thread(target=lajfenlei,) # syy.setDaemon(True) #把子线程设置成守护线程 syy.start() while threading.activeCount() != 1: pass print(count) print('完成!')
# Python里面的多线程,是不能利用多核CPU的
如果想利用多核CPU的话,就得使用多进程
python中多进程使用multiprocessing模块
import multiprocessing import time import threading def say(): time.sleep(2) print('hhhh') def lajfenlei(): for i in range(10): t = threading.Thread(target=say) t.start() print(threading.activeCount()) print('垃圾分类') if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=lajfenlei) p.start() print(p.pid ) while len(multiprocessing.active_children())!=0:#等待子进程执行完成 pass print('子进程都运行完了。')
设置进程池
import threadpool import threading import requests import hashlib def down_load_file(url): r = requests.get(url) m = hashlib.md5(url.encode()) print('正在下载====%s'%m.hexdigest()) with open('%s.jpg'%m.hexdigest(),'wb') as fw: fw.write(r.content) url_list = ['http://www.nnzhp.cn/wp-content/uploads/2019/02/jiami.jpeg', 'http://www.nnzhp.cn/wp-content/uploads/2019/03/js.png', 'http://www.nnzhp.cn/wp-content/uploads/2018/08/ab389f04cb5b57344ef9655428bccaec.png' ] pool = threadpool.ThreadPool(10)#创建一个线程池,指定线程池最多有多少个线程 reqs = threadpool.makeRequests(down_load_file,url_list) #调用生成启动线程用的参数 # for req in reqs: # pool.putRequest(req) [pool.putRequest(req) for req in reqs] print('当前的线程数',threading.activeCount()) pool.wait() #等待 print('测试结束')