• 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]
  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    block的是发送信号的线程,又不是处理槽函数的线程
  • 原文地址:https://www.cnblogs.com/allenzhang-920/p/10371903.html
Copyright © 2020-2023  润新知