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()

以上程序運行結果是直接打印:app

進程0正在運行
進程1正在運行
進程2正在運行
進程3正在運行
進程4正在運行socket

若是join的註釋被去掉,相似多線程也變成了串行,每過5秒打印一次。spa

 

每一個進程都由父進程啓動線程

# 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()

 

進程間的通信code

1.多進程Queueorm

multiprocessing模塊下的Queue經過數據傳遞實現進程間的通信。本質上不是共享一個Queue,而是克隆了一個Queue,由一箇中間的內存進行數據傳遞(數據需通過pickle)blog

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(進程間共享和傳遞數據,實際上也是克隆)ip

# 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]
相關文章
相關標籤/搜索