zoukankan      html  css  js  c++  java
  • 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('吃完了')#主代码结束以后守护进程(消费者函数)也随之结束。
    #队列内部自带互斥锁,不会出现几个进程同时取一个数据的情况。维护先进先出的顺序,保证了数据的安全。
    队列
  • 相关阅读:
    常用的40个建站代码及使用说明
    vs2008与vs2005的冲突
    ASP调用.net的webservices的实现方法
    Web Development Tools for the Power Developer
    XML Web Service开发实例——通过Windows Forms调用Web Service
    “家贼”倒卖“征途”源代码 13万元卖给识货人
    [轉載]让UpdatePanel支持文件上传
    DB2与Sybase/Oracle/Informix的比较
    網頁打印代碼大全
    完整的网站间共享数据的WebService
  • 原文地址:https://www.cnblogs.com/liujjpeipei/p/9179402.html
Copyright © 2011-2022 走看看