zoukankan      html  css  js  c++  java
  • ython实现进程间的通信有Queue,Pipe,Value+Array等,其中Queue实现多个进程间的通信,而Pipe实现两个进程间通信,而Value+Array使用得是共享内存映射文件的方式,所以速度比较快

    1.Queue的使用

    from multiprocessing import Queue,Process
    import os,time,random
    
    #添加数据函数
    def proc_write(queue,urls):
        print("进程(%s)正在写入..."%(os.getpid()))
        for url in urls:
            queue.put(url)
            print("%s被写入到队列中"%(url))
            time.sleep(random.random()*3)
    
    #读取数据函数
    def proc_read(queue):
        print("进程(%s)正在读取..."%(os.getpid()))
    
        while True:
            url = queue.get();
            print("从队列中提取到:%s"%(url))
    
    if __name__ =="__main__":
        queue = Queue()
        proc_writer1 = Process(target=proc_write,args=(queue,["ur1","ur2","ur3","ur4"]))
        proc_writer2 = Process(target=proc_write,args=(queue,["ur5","ur6","ur7","ur8"]))
        proc_reader = Process(target=proc_read,args=(queue,))
        proc_writer1.start()
        proc_writer2.start()
        proc_reader.start()
        proc_writer1.join()
        proc_writer2.join()
        proc_reader.terminate()
    

    2.Pipe的使用

    pipe用于两个进程间的通信,两个进程分别位于管道的两端,Pipe方法返回(conn1,conn2)代表一个管道的两端,Pipe方法有dumplex参数,若该参数为True,管道为全双工模式,若为Fasle,conn1只负责接收消息,conn2只负责发送消息.send和recv方法分别是发送和接收消息的方法,例如,在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息,如果没有消息可以接收,recv方法会一直阻塞,如果管道已经被关闭,recv方法会抛出EOFError

    from multiprocessing import Pipe,Process
    import random,time,os
    
    def proc_send(pipe,urls):
        for url in urls:
            print("进程(%s)发送:%s"%(os.getpid(),url))
            pipe.send(url)
            time.sleep(random.random())
    
    def proc_recv(pipe):
        while True:
            print("进程(%s)接收到:%s"%(os.getpid(),pipe.recv()))
            time.sleep(random.random())
    
    if __name__ == "__main__":
        pipe = Pipe()
        p1 = Process(target=proc_send,args=(pipe[0],["url_"+str(i) for i in range(10)],))
        p2 = Process(target=proc_recv,args=(pipe[1],))
        p1.start()
        p2.start()
        p1.join()
        p2.terminate()
    --------------------- 
    作者:诸葛亮
    来源:博客园
    原文:https://www.cnblogs.com/gaosai/
    版权声明:本文为博主原创文章,转载请附上博文链接!


  • 相关阅读:
    .NET HttpWebRequest应用
    .NET 文件上传和文件接收
    小程序报错:对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2
    发布微信小程序体验版
    .NET 通过entity framework报数据库连接错误:ORA-01017: invalid username/password; logon denied
    将Oracle 12c的某用户数据迁移至OracleXE的用户
    C# Oracle 时间字符串转时间类型
    在.NET中调用Java的类
    Oracle 取前几条记录
    oracle impdp将导出用户的所有对象导入至另一个用户下,生成的触发器语句问题处理
  • 原文地址:https://www.cnblogs.com/gaosai/p/9825051.html
Copyright © 2011-2022 走看看