1. 程式人生 > >Python multiprocessing (多程序)使用

Python multiprocessing (多程序)使用

官方文件 https://docs.python.org/3.6/library/multiprocessing.html

from multiprocessing import Pool, Manager
import time, random, os

# 需要執行的函式
def f(x):
    time.sleep(random.randint(1, 3))
    return x, os.getpid()


# 回撥函式
def p_callback(res):
    x, pid = res
    print("回撥程序ID號:%s, 結果:%s" % (pid, x))


def
m_callback(res):
d, pid = res d.value += 1 print("回撥程序ID號:%s, 結果:%s" % (pid, d)) if __name__ == '__main__': with Pool(4) as p: print("----------map----------") # 會阻塞,直到所有的程序都執行完畢 print(p.map(f, [1, 2, 3])) print("----------imap----------") # 阻塞懶惰map,需要呼叫結果next 驅動任務繼續執行
it = p.imap(f, range(10)) for x in it:# 這裡相當於主動呼叫了 next print("\t", x) print("----------imap_unordered----------") # 與map一樣都是阻塞懶惰模式,但是imap_unordered不保證結果順序 it = p.imap_unordered(f, range(10)) for x in it: print("\t", x) with
Pool(4) as p: for i in range(10): # 非同步,非阻塞方式執行,主程序需要等待子程序完成 p.apply_async(f, (i,), callback=p_callback) print("-------- apply_async --------") p.close() p.join() # 主程序等待子程序結束 # 程序共享物件 with Manager() as m: v = m.Value('i', 0) # i ctype int 型別 # 支援型別:list,dict,Namespace,Lock, RLock,Semaphore,BoundedSemaphore, # Condition,Event,Barrier, Queue,Value和Array。例如, with Pool(4) as p: for i in range(10): p.apply_async(f, args=(v,), callback=m_callback) p.close() p.join()

結果如下:

D:\software\Anaconda3\pythonw.exe D:/workspace/PycharmProjects/DeltaGrad/trunk/strategy/load/thread_test.py
----------map----------
[(1, 12344), (2, 22720), (3, 21940)]
----------imap----------
     (0, 20732)
     (1, 12344)
     (2, 22720)
     (3, 21940)
     (4, 22720)
     (5, 21940)
     (6, 12344)
     (7, 22720)
     (8, 20732)
     (9, 12344)
----------imap_unordered----------
     (1, 21940)
     (2, 20732)
     (4, 21940)
     (0, 22720)
     (3, 12344)
     (8, 21940)
     (5, 20732)
     (7, 12344)
     (6, 22720)
     (9, 21940)
-------- apply_async --------
回撥程序ID號:17424, 結果:1
回撥程序ID號:21744, 結果:2
回撥程序ID號:23220, 結果:0
回撥程序ID號:17424, 結果:4
回撥程序ID號:21744, 結果:5
回撥程序ID號:1360, 結果:3
回撥程序ID號:21744, 結果:8
回撥程序ID號:23220, 結果:6
回撥程序ID號:17424, 結果:7
回撥程序ID號:1360, 結果:9
回撥程序ID號:3164, 結果:Value('i', 1)
回撥程序ID號:18120, 結果:Value('i', 2)
回撥程序ID號:18116, 結果:Value('i', 3)
回撥程序ID號:22108, 結果:Value('i', 4)
回撥程序ID號:18120, 結果:Value('i', 5)
回撥程序ID號:3164, 結果:Value('i', 6)
回撥程序ID號:3164, 結果:Value('i', 7)
回撥程序ID號:18116, 結果:Value('i', 8)
回撥程序ID號:22108, 結果:Value('i', 9)
回撥程序ID號:18120, 結果:Value('i', 10)