zoukankan      html  css  js  c++  java
  • Python多进程

    多进程的语法跟多线程有些相似

    # coding=utf-8
    import multiprocessing
    import time
    
    
    def run(index):
        print u'进程{}正在运行'.format(str(index))
        time.sleep(5)
    
    
    if __name__ == '__main__':
        for i in range(5):
            p = multiprocessing.Process(target=run, args=(i,))
            p.start()
            # p.join()

    以上程序运行结果是直接打印:

    进程0正在运行
    进程1正在运行
    进程2正在运行
    进程3正在运行
    进程4正在运行

    如果join的注释被去掉,类似多线程也变成了串行,每过5秒打印一次。

    每个进程都由父进程启动

    # coding=utf-8
    from multiprocessing import Process
    import os
    
    def info(title):
        print title
        print 'module name:', __name__
        # print 'parent process:', os.getppid()  # 打印父进程id(只在Unix和Linux系统中有效)
        print 'process id:', os.getpid()  # 打印当前进程id
        print '
    
    '
    
    def f(name):
        info('33[31:1mfunction f33[0m')
        print('hello', name)
    
    
    if __name__ == '__main__':
        info('33[32;1mmain process line33[0m')
        p = Process(target=f, args=('bob',))
        p.start()
        p.join()

    进程间的通讯

    1.多进程Queue

    multiprocessing模块下的Queue通过数据传递实现进程间的通讯。本质上不是共享一个Queue,而是克隆了一个Queue,由一个中间的内存进行数据传递(数据需经过pickle)

    from multiprocessing import Process, Queue
    
    
    def f(q):
        q.put('666')
    
    
    if __name__ == '__main__':
        q = Queue()
        p = Process(target=f, args=(q,))
        p.start()
        p.join()
        print q.get()
    
    # 输出666

    2.Pipe管道

    # coding=utf-8
    from multiprocessing import Process, Pipe
    
    
    def f(child_conn):
        child_conn.send([1, 2, 3])
        print child_conn.recv()
        child_conn.close()
    
    
    if __name__ == '__main__':
        parent_conn, child_conn = Pipe()  # Pipe方法返回管道(Pipe)的两头,两个进程分别通过管道的两头通讯。此方法与socket用法相似
        p = Process(target=f, args=(child_conn,))
        p.start()
        print parent_conn.recv()
        parent_conn.send(u'已收到!')
        p.join()

    3.Manager(进程间共享和传递数据,实际上也是克隆)

    # coding=utf-8
    from multiprocessing import Process, Manager
    import os
    
    
    def f(d, l):
        d[os.getpid()] = os.getpid()
        l.append(os.getpid())
    
    
    
    if __name__ == '__main__':
        with Manager() as manager:
            d = manager.dict()  # 创建一个可用于进程间共享和传递的字典
            l = manager.list(range(3))  # 创建一个可用于进程间共享和传递的列表
            p_list = []
            for i in range(10):
                p = Process(target=f, args=(d, l))
                p.start()
                p_list.append(p)
            for p in p_list:
                p.join()
            print d
            print l
    
    输出:
    {2960: 2960, 4504: 4504, 7528: 7528, 11880: 11880, 4436: 4436, 14160: 14160, 8568: 8568, 6484: 6484, 792: 792, 9336: 9336}
    [0, 1, 2, 792, 6484, 8568, 14160, 9336, 7528, 2960, 4504, 4436, 11880]
  • 相关阅读:
    net5:动态修改内存中的站点地图节点
    手动创建DataTable并绑定gridview
    文件转换成二进制流及二进制流转换成文件
    XML 增、删、改和查的实例【转】
    免费CSS鼠标样式代码大全
    C#连接数据库SQL(2005)
    关于hibernate4.3版本之后org.hibernate.service.ServiceRegistryBuilder被弃用
    史上最全的Maven Pom文件标签详解
    Readme.MD 例子
    GitHub中README.md文件的编辑和使用
  • 原文地址:https://www.cnblogs.com/allenzhang-920/p/10371903.html
Copyright © 2011-2022 走看看