py 6.13

#进程池: Pool : 节省系统回收资源的时间,降低操作系统的难度。
#适合纯计算型的程序。  多进程:适合高IO
# from multiprocessing import Pool
#
# def cal(num):
#     print(num*num)
#     return num*'-'     #返回给apply_async提交任务端r。用get获取返回值。
#
# if __name__ == '__main__':
#     p = Pool(5) #进程池的进程数根据:CPU/CPU+1
#     lis =[]
#     for i in range(101):
#         r = p.apply_async(func=cal,args=(i,))(func=函数名,args=参数)#异步操作,提交一个任务。
#         lis.append(r)   #如果每次都get的话,就变成同步操作了。
#     for r_lis in lis:
#         print(r_lis.get())
#     p.close() #与jojn必须同时存在。关闭进程池(里面进程不会结束)防止进一步操作,不再接收新的任务。
#     p.join()  #等待所有子进程结束后再结束主代码,否则主进程会直接结束。必须放在close后面。

#p.apply:同步提交任务,失去了多进程的作用。
#p.map: 与p.apply_async功能一样,省略了close和join,但是没有返回值。
# from multiprocessing import Pool
#
# def cal(num):
#     print(num*num)
#
# if __name__ == '__main__':
#     p = Pool(5)
#     p.map(func=cal,iterable =range(101)) #(func= 函数名,iterable = 可迭代对象)
    #不需要关闭和阻塞。
#进城池中的回调函数
# import os
# from multiprocessing import  Pool
#
# def wahaha():
#     return 5
#
# def call(argv):#接收一个参数,接收的是wahaha的返回值。
#     print(os.getpid())#跟主进程的pid相同,利用的是主进程的资源。原因:在子进程工作且主进程
#     print(argv)       #空闲时,利用主进程来进程一些简单的运算分析。
#
# if __name__ == '__main__':
#     print(os.getpid())
#     p = Pool(5)
#     p.apply_async(func=wahaha,callback=call)#call:回调函数名 . 接收wahaha中的返回值。
#     p.close()
#     p.join()
进程池
#Pipe:管道。lr,lp = Pipe() 管道的两端有一端不用的时候都需要关闭。
#管道的数据不安全。队列的实现机制:管道+锁。
# from multiprocessing import Process,Pipe
#
# def func(lr,rp):
#     lr.close()  #将不用的发送端关闭,管道中依据引用计数,必须关闭所有管道才能生成EOFError异常。
#     while True:
#         try:
#             print(rp.recv())
#         except EOFError:break
#
# if __name__ == '__main__':
#     lr ,rp = Pipe() #创建管道的两端
#     Process(target=func,args=(lr,rp)).start()#可开启多个子进程
#     lr.send('hello') #一端发送。
#     rp.close() #将不用的接收端关闭
#     lr.close() #发送完毕后将发送端关闭,使子进程报错,进入异常处理
#进程间可以数据共享,如列表字典,但是会造成数据混乱。、
管道
# import time
# import random
# from multiprocessing import Process,Queue
#    
# def consumer(q):
#     while True:
#         obj = q.get()
#         if obj == None:break
#         print('消费了一个数据%s'%obj)
#         time.sleep(random.randint(1,3))
#
# def produser(q):
#     for i in range(10):
#         time.sleep(random.randint(1,5))
#         q.put('food%s'%i)
#         print('生产了一个food%s'%i)
#
# if __name__ == '__main__':
#     q = Queue()
#     p = Process(target=consumer,args=(q,))
#     p.start()
#tcp协议实现与多客户端通信。1.socketserver 2:创建多个进程与client通信。
#队列。生产消费模型:
# import time
# import random
# from multiprocessing import Process,Queue
#
# def consumer(name,q):
#     while True:
#         obj = q.get()  #如果队列中无值可取,则阻塞,等待放值再取值。
#         if obj == None:break #主中等待生产函数完成时,往队列里放了与消费者数等同的None.
#         print('%s拿出了一个数据%s'%(name,obj))
#         time.sleep(random.randint(1,3))
#
# def produser(name,q):
#     for i in range(10):
#         time.sleep(random.randint(1,5))
#         q.put('food%s'%i) #循环一次放入一个,可以有多个生产者一起异步生产。
#         print('%s放入了一个数据food%s'%(name,i))
#
# if __name__ == '__main__':
#     q = Queue()
#     # p1 = Process(target=consumer,args=('alex',q))
#     p2 = Process(target=consumer,args=('egon',q)) #创建多个消费者,将姓名与队列对象传进去。
#     p3 = Process(target=produser,args=('zhangsan',q))#创建多个生产者
#     p4 = Process(target=produser,args=('lisi',q))
#     lis = [p2,p3,p4]      #由于创建进程较多,可以循环开启。
#     for p in lis:
#         p.start()
#     p3.join()     #为使消费者get不阻塞,需要放入一个标志位使消费者知道已经生产完成了,所以将生成函数阻塞,等到所有生产
#     p4.join()     #函数结束时,执行下面加None标志位的代码。
#     q.put(None)   #有几个消费者就加几个,否则有的取不到就会等待。程序无法结束。
#     q.put(None)
#JoinableQueue:不用加标志位告知,通过感知task_done执行是否完成来判断队列是否为空,生产是否完成。、
# import time
# import random
# from multiprocessing import Process,JoinableQueue
#
# def consumer(name,q):
#     while True:
#         obj = q.get()  #不能根据get判断是否取完,因为get到数据后需要处理,不能马上结束。
#         if obj == None:break
#         print('%s吃了%s'%(name,obj))
#         time.sleep(random.randint(1,3))
#         q.task_done()  #告知队列已经取了一次数据。如果一共10个数据,则取10次。
#
# def produser(name,q):
#     for i in range(10):
#         time.sleep(random.randint(1,5))
#         q.put('第%s坨屎'%i)
#         print('%s拉了第%s坨屎'%(name,i))
#
# if __name__ == '__main__':
#     q = JoinableQueue()
#     p1 = Process(target=consumer,args=('吕杨',q))
#     p1.daemon = True  #将消费者进程设为守护进程。
#     p2 = Process(target=consumer,args=('李淑旗',q))
#     p2.daemon = True
#     p3 = Process(target=produser,args=('la',q))
#     p4 = Process(target=produser,args=('lala',q))
#     lis = [p1,p2,p3,p4]
#     for p in lis:
#         p.start()
#     p3.join()
#     p4.join()
#     q.join() #阻塞队列。判断task_done执行次数是否完成。执行完以后则解除阻塞,代码往下执行。
#     print('吃完了')#主代码结束以后守护进程(消费者函数)也随之结束。
#队列内部自带互斥锁,不会出现几个进程同时取一个数据的情况。维护先进先出的顺序,保证了数据的安全。
队列

猜你喜欢

转载自www.cnblogs.com/liujjpeipei/p/9179402.html