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 '\n\n'

def f(name):
    info('\033[31:1mfunction f\033[0m')
    print('hello', name)


if __name__ == '__main__':
    info('\033[32;1mmain process line\033[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]

 

posted @ 2019-02-13 21:27  AllenZhang_(*^▽^*)  阅读(152)  评论(0编辑  收藏  举报