zoukankan      html  css  js  c++  java
  • Python 进程间的通信

    #-*-coding:utf-8-*-
    '''python提供了多种进程间的通信方式,如:Queue,Pipe,Valie+Array等。
        Queue与Pipe的区别在于Pipe常用来在两个进程间通信,Queue用来在多个进程间通信
        Queue:
            Put:用于插入数据到队列中(blocked,timeoutl两个可选参数,如果blocked为True(默认值)
                            并且timeout为正值,该方法会阻塞timeout指定时间,指导队列有剩余空间,如果超时,会抛出Queue.Full异常,
                            如果blocked为False,但Queue已满,会立即抛出Queue.Full异常)
            Get:从队列读取并删除一个元素(blcoked,timeout两个可选参数,如果blocked为True(默认值)并且timeout为正值
            name在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,则分为两种情况:
                            如果Queue有一个值可用,则立即返回该值;否则如果队列为空,则立即抛出Queue.Empty异常)
    '''
    #例子:在父进程中创建三个子进程,两个资金长王Queue中写入数据一个进程从Queue中读取数据
    # from multiprocessing import Process,Queue
    # import os,time,random
    #
    # #写数据进程执行的代码:
    # def proc_write(q,urls):
    #     print('Process(%s) is writing...'%os.getcwd())
    #     for url in urls:
    #         q.put(url)
    #         print('Put %s to queue...'%url)
    #         time.sleep(random.random())
    # #读数据进程执行的代码:
    # def proc_read(q):
    #     print('Process(%s) is reading...'%os.getpid())
    #     while True:
    #         url=q.get(True)
    #         print('get %s from queue.'%url)
    # if __name__=="__main__":
    #     #父进程创建Queue,并传递给各个子进程
    #     q=Queue()
    #     proc_write1=Process(target=proc_write,args=(q,['url_1','url_2','url_3']))
    #     proc_write2=Process(target=proc_write,args=(q,['url_4','url_5','url_6']))
    #     proc_reader=Process(target=proc_read,args=(q,))
    #     #启动子进程proc_writer写入
    #     proc_write1.start()
    #     proc_write2.start()
    #     #启动子进程proc_reader读取
    #     proc_reader.start()
    #     #等待proc_writer结束:
    #     proc_write1.join()
    #     proc_write2.join()
    #     #proc_reader进程里是死循环无法等待其结束,只能强行终止
    #     
    from multiprocessing import Pipe
    '''Pipe常用在两个进程间进行通信,两个进程分别位于进程两端,Pipe方法返回(conn1,conn2)代表一个
    管道的两端。Pipe方法有duplex参数,如果duplex为True(默认值)name这个管道是全双工模式,也就是说
    conn1和conn2均可以收发,如果duplex为False,conn1只负责接收消息,conn2只负责发送消息。send
    和recv方法分别是发送和接收消息的方法'''
        #创建两个进程,一个进程通过Pipe发送数据一个进程通过Pipe接收数据
    import multiprocessing
    import random
    import time,os
    def proc_send(pipe,urls):
        for url in urls:
            print("Process(%s) send: %s" %(os.getpid(),url))
            pipe.send(url)
            time.sleep(random.random())
    def proc_recv(pipe):
        while True:
            print("Process(%s) rev:%s"%(os.getpid,pipe.recv()))
            time.sleep(random.random())
    if __name__=="__main__":
        pipe=multiprocessing.Pipe()
        p1=multiprocessing.Process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10)]))
        p2=multiprocessing.Process(target=proc_recv,args=(pipe[1],))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
    


        
        摘自《Python爬虫开发与项目实战》

  • 相关阅读:
    Codeforces Round #229
    A Funny Game(博弈论)
    01背包模板
    一月24日新生冬季练习赛解题报告H.排列问题
    一月24日新生冬季练习赛解题报告F.棋盘
    POJ 2240Arbitrage
    POJ 3660Cow Contest
    POJ 3259Wormholes
    POJ 1860Currency Exchange
    HDU 4027Can you answer these queries?
  • 原文地址:https://www.cnblogs.com/bin-l/p/8532655.html
Copyright © 2011-2022 走看看