一.进程通信(IPC)
管道: 队列: 管道+锁 #管道 #队列=管道+锁 from multiprocessing import Queue # q=Queue() # q.put(['first',]) # q.put({'x':2}) # q.put(3) # # q.put(4) # # print(q.get()) # print(q.get()) # print(q.get()) # print(q.get()) # 了解: q=Queue(3) # q.put(['first',],block=True,timeout=3) # q.put({'x':2},block=True,timeout=3) # q.put(3,block=True,timeout=3) # q.put(4,block=True,timeout=3) q.put_nowait(1) #q.put(1,block=False) q.put_nowait(2) q.put_nowait(3) # q.put_nowait(4) # print(q.get(block=True,timeout=3)) # print(q.get(block=True,timeout=3)) # print(q.get(block=True,timeout=3)) # print(q.get(block=True,timeout=3)) print(q.get_nowait()) #q.get(block=false) print(q.get_nowait()) #q.get(block=false) print(q.get_nowait()) #q.get(block=false) print(q.get_nowait()) #q.get(block=false)
二.生产者与消费者模型
''' 1. 什么是生产者消费者模型 生产者:代指生产数据的任务 消费者:代指处理数据的任务 该模型的工作方式: 生产生产数据传递消费者处理 实现方式: 生产者---->队列<------消费者 2. 为何要用 当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据 就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率 3. 如何用 ''' ''' import time,random from multiprocessing import Process,Queue def producer(name,food,q): for i in range(3): res='%s%s' %(food,i) time.sleep(random.randint(1,3)) #模拟生产数据的时间 q.put(res) print('厨师[%s]生产了<%s>' %(name,res)) def consumer(name,q): while True: res=q.get() if res is None:break time.sleep(random.randint(1,3)) #模拟处理数据的时间 print('吃货[%s]吃了<%s>' %(name,res)) if __name__ == '__main__': q=Queue() # 生产者们 p1=Process(target=producer,args=('小Egon','泔水',q)) p2=Process(target=producer,args=('中Egon','屎包子',q)) p3=Process(target=producer,args=('大Egon','腰子汤',q)) # 消费者们 c1=Process(target=consumer,args=('刘清正',q)) c2=Process(target=consumer,args=('吴三江',q)) p1.start() p2.start() p3.start() c1.start() c2.start() p1.join() p2.join() p3.join() q.put(None) q.put(None) print('主') ''' import time,random from multiprocessing import Process,JoinableQueue def producer(name,food,q): for i in range(3): res='%s%s' %(food,i) time.sleep(random.randint(1,3)) #模拟生产数据的时间 q.put(res) print('厨师[%s]生产了<%s>' %(name,res)) def consumer(name,q): while True: res=q.get() time.sleep(random.randint(1,3)) #模拟处理数据的时间 print('吃货[%s]吃了<%s>' %(name,res)) q.task_done() if __name__ == '__main__': q=JoinableQueue() # 生产者们 p1=Process(target=producer,args=('小Egon','泔水',q)) p2=Process(target=producer,args=('中Egon','屎包子',q)) p3=Process(target=producer,args=('大Egon','腰子汤',q)) # 消费者们 c1=Process(target=consumer,args=('刘清正',q)) c2=Process(target=consumer,args=('吴三江',q)) c1.daemon=True c2.daemon=True p1.start() p2.start() p3.start() c1.start() c2.start() p1.join() p2.join() p3.join() q.join() # 主进程等q结束,即q内数据被取干净了 print('主')
三.线程理论:
1 什么是线程 进程其实一个资源单位,而进程内的线程才是cpu上的执行单位 线程其实指的就是代码的执行过程 2 为何要用线程 线程vs进程 1. 同一进程下的多个线程共享该进程内的资源 2. 创建线程的开销要远远小于进程
四.开启线程的两种方式:
''' from threading import Thread import time def task(name): print('%s is running' %name) time.sleep(2) print('%s is done' %name) if __name__ == '__main__': t=Thread(target=task,args=('线程1',)) t.start() print('主') ''' from threading import Thread import time class Mythread(Thread): def run(self): print('%s is running' %self.name) time.sleep(2) print('%s is done' %self.name) if __name__ == '__main__': t=Mythread() t.start() print('主')
五.线程的特性介绍:
# from threading import Thread # import time # # n=100 # def task(): # global n # n=0 # # if __name__ == '__main__': # t=Thread(target=task) # t.start() # t.join() # print('主',n) # from threading import Thread # import time,os # # def task(): # print('%s is running' %os.getpid()) # # if __name__ == '__main__': # t=Thread(target=task) # t.start() # print('主',os.getpid()) from threading import Thread,active_count,current_thread import time,os def task(): print('%s is running' %current_thread().name) time.sleep(2) if __name__ == '__main__': t=Thread(target=task,) t.start() # t.join() # print('主',active_count()) print('主',current_thread().name)
六.守护线程:
# from threading import Thread # import time # # def task(name): # print('%s is running' %name) # time.sleep(2) # print('%s is done' %name) # # if __name__ == '__main__': # t=Thread(target=task,args=('线程1',)) # t.daemon=True # t.start() # print('主') from threading import Thread from multiprocessing import Process import time def foo(): print(123) time.sleep(1) print("end123") def bar(): print(456) time.sleep(3) print("end456") if __name__ == '__main__': # t1=Thread(target=foo) # t2=Thread(target=bar) t1=Process(target=foo) t2=Process(target=bar) t1.daemon=True t1.start() t2.start() print("main-------") ''' 123 main------- 456 end456 ''' ''' main------- 123 456 end456 ''' ''' main------- 456 end456 '''
七.线程互斥锁
from threading import Thread,Lock import time mutex=Lock() n=100 def task(): global n mutex.acquire() temp=n time.sleep(0.1) n=temp-1 mutex.release() if __name__ == '__main__': t_l=[] for i in range(100): t=Thread(target=task) t_l.append(t) t.start() for t in t_l: t.join() print(n)