1,数据共享:from multiprocessing import Manager
把所有实现了数据共享的比较便捷的类都重新又封装了一遍,并且在原有的multiprocessing基础上
增加了新的机制 :dict ,list
2数据共享的机制:
支持的数据类型非常有限
list,dict数据是不安全的,需要通过加锁来保证数据安全
from multiprocessing import Manager,Process,Lock def work(d,lock): with lock: d['count'] -= 1 if __name__ == '__main__': lock = Lock() with Manager() as m: dic = m.dict({'count':100}) p_l = [] for i in range(100): p = Process(target=work,args=(dic,lock)) p.start() p_l.append(p) for p in p_l: p.join() print(dic)
3:回调函数:
当func执行完毕之后执行callback的参数
func的返回值会作为callback的参数
回调函数是哪个进程实现的? --主进程
子进程有大量的计算要去做,回调函数等待结果做简单的处理,可交由主进程进行
from multiprocessing import Pool def func(a): num = a return num def callback(x): y = x**2 print(y) if __name__ == '__main__': p = Pool() print('主进程') p.apply_async(func,args=(100,),callback=callback) p.close() p.join()
4.线程理论:
进程是什么:
计算机中分配资源的最小单位,是计算机中正在执行的程序
进程对操作系统有一定的负担,操作系统要分配给一个进行的资源大致有:代码,数据,文件
线程是什么:
线程是计算机中被CPU调度的最小单位,
进程与线程之间的关系:
一个进程中都有一个线程
线程是不能独立存在的,他没有属于自己的进程资源
线程的特点:
同一进程中的所有的线程的资源是共享的
轻量级,自己的资源
线程与进程之间的区别:
占用的资源
调度的效率
资源是否共享:进程与进程之间的资源是不共享的,同一进程中的所有的线程的资源四共享的
一个进程中的所有线程是否能够并行:
不行:Cpython解释器内部有一把全局解释器锁:GIL
所以线程不能充分利用多核
同一时刻同一个进程中的线程只有一个会被CPU调度
GIL锁 确实限制了程序的效率,提高了数据的安全性
GIL锁 目前是能够帮助线程在切换中提高效率
5.threading 模块:
并发
from threading import Thread def func(i): print(i) print('主进程') for i in range(10): t = Thread(target=func,args=(i,)) t.start()
轻量级:线程比进程耗时少
import time import random from threading import Thread from multiprocessing import Process def func(i): print(i) time.sleep(random.random()) # if __name__ == '__main__': # t_lst = [] # start = time.time() # for i in range(1000): # t = Thread(target=func,args=(i,)) # t.start() # t_lst.append(t) # for t in t_lst: # t.join() # print(time.time() - start) if __name__ == '__main__': p_lst = [] start = time.time() for i in range(1000): p = Process(target=func,args=(i,)) p.start() p_lst.append(p) for p in p_lst: p.join() print(time.time() - start)
数据共享:
from threading import Thread num = 100 def func(): global num num -= 1 t_lst = [] for i in range(100): t = Thread(target=func) t.start() t_lst.append(t) for t in t_lst: t.join() print(num)
import time from threading import Thread def func(): time.sleep(3) t = Thread(target=func) t.start() print(t.is_alive()) #查看线程是否活着 print(t.getName()) #查看线程名字 # print(t.setName('t1'))#修改线程名字
6:守护线程:
守护线程 是在主程序代码结束之后,还等待了子进程执行结束才结束
主线程结束意味着主进程结束
主线程等待所有的线程结束
主线程结束了之后,守护线程随着主进程的结束自然结束了.
import time from threading import Thread def func(): while True: time.sleep(0.5) print(123456) def func1(): print('666') time.sleep(3) print('4444') t = Thread(target=func) t1 = Thread(target=func1) t1.setDaemon(True) t.start() t1.start() print('主程序结束')