zoukankan      html  css  js  c++  java
  • python进程通信的几种实现方式

    from multiprocessing import Pipe,Process,Queue,Manager,JoinableQueue
    1、管道
    #管道
    def task(name,a):
        a.send({name:[i for i in range(10000)]})
        print('当前进程号%s'%os.getpid() + '父进程号%s'%os.getppid())
    if __name__ == '__main__':
        child_conn,parent_conn = Pipe()
        job = []
        task_values = []
        for i in range(5):
            p = Process(target=task,args=(i,child_conn))
            job.append(p)
            p.start()
            data = parent_conn.recv()
            task_values.append(data)
        for i in job:
            i.join()
        print(task_values)
        print('当前进程号%s' % os.getpid() + '父进程号%s' % os.getppid())

    2、queue队列

    #queue队列
    def task1(queue):
        task_values = []
        while True:
            res = queue.get()
            task_values.append(res)
            if res is None:
                print(task_values)
                break  # 收到结束信号则结束
    def task(name,queue):
        queue.put({name: [i for i in range(10000)]})
        print('当前进程号%s' % os.getpid() + '父进程号%s' % os.getppid())
    if __name__ == '__main__':
        queue = Queue()
        jobs = []
        c = Process(target=task1,args=(queue,))
        c.start()
        for i in range(5):
            p = Process(target=task, args=(i, queue))
            jobs.append(p)
            p.start()
        for job in jobs:
            job.join()
        queue.put(None)

    3、数据共享

    #数据共享
    def task(name,manager):
        manager[name] = {name:[i for i in range(10000)]}
        print('当前进程号%s' % os.getpid() + '父进程号%s' % os.getppid())
    if __name__ == '__main__':
        manager = Manager()
        m = manager.list()
        jobs = []
        for i in range(5):
            m.append(i)
            p = Process(target=task, args=(i, m))
            jobs.append(p)
            p.start()
        for job in jobs:
            job.join()
        print(m)

    4、JoinableQueue队列

    #JoinableQueue队列
    def producer(name,jq):
        jq.put({name:[i for i in range(10000)]})
        print('当前进程号%s' % os.getpid() + '父进程号%s' % os.getppid())
    def consumer(jq):
        task_values = []
        while True:
            res = jq.get()
            task_values.append(res)
            if res is None:
                print(task_values)
            jq.task_done()
    if __name__ == '__main__':
        jq = JoinableQueue()
        c = Process(target=consumer,args=(jq,))
        c.daemon = True
        c.start()
        jobs = []
        for i in range(5):
            p = Process(target=producer, args=(i, jq))
            jobs.append(p)
            p.start()
        for job in jobs:
            job.join()
        jq.put(None)
        jq.join()
        print('主进程结束')
  • 相关阅读:
    [恢]hdu 1406
    [恢]hdu 1870
    [恢]hdu 1877
    [恢]hdu 1018
    [转载]Delphi 的编译指令(2): 条件语句的更多用法
    关于 class helper for ... 语法
    [转载]Delphi 的编译指令(1): $DEFINE、$UNDEF、$IFDEF等
    [转载]Delphi 的编译指令(3): 常用的预定义条件标识符
    Delphi2009之TStringBuilder类[3]:Replace
    Delphi2009之TStringBuilder类[1]:Create
  • 原文地址:https://www.cnblogs.com/aadmina/p/10310756.html
Copyright © 2011-2022 走看看