本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
本篇文章來自騰訊云 作者:孤獨的明月
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料, )
行程的創建-multiprocessing
multiprocessing模塊就是跨平臺版本的多行程模塊,提供了一個Process類來代表一個行程物件,這個物件可以理解為是一個獨立的行程,可以執行另外的事情
# -*- coding:utf-8 -*- from multiprocessing import Process import time def run_proc(): """子行程要執行的代碼""" while True: print("----2----") time.sleep(1) if __name__=='__main__': p = Process(target=run_proc) p.start() while True: print("----1----") time.sleep(1)
創建子行程時,只需要傳入一個執行函式和函式的引數,創建一個Process實體,用start()方法啟動
行程pid
# -*- coding:utf-8 -*- from multiprocessing import Process import os import time def run_proc(): """子行程要執行的代碼""" print('子行程運行中,pid=%d...' % os.getpid()) # os.getpid獲取當前行程的行程號 print('子行程將要結束...') if __name__ == '__main__': print('父行程pid: %d' % os.getpid()) # os.getpid獲取當前行程的行程號 p = Process(target=run_proc) p.start()

給子行程指定的函式傳遞引數
# -*- coding:utf-8 -*- from multiprocessing import Process import os from time import sleep def run_proc(name, age, **kwargs): for i in range(10): print('子行程運行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid())) print(kwargs) sleep(0.2) if __name__=='__main__': p = Process(target=run_proc, args=('test',18), kwargs={"m":20}) p.start() sleep(1) # 1秒中之后,立即結束子行程 p.terminate() p.join() 運行結果: 子行程運行中,name= test,age=18 ,pid=45097... {'m': 20} 子行程運行中,name= test,age=18 ,pid=45097... {'m': 20} 子行程運行中,name= test,age=18 ,pid=45097... {'m': 20} 子行程運行中,name= test,age=18 ,pid=45097... {'m': 20} 子行程運行中,name= test,age=18 ,pid=45097... {'m': 20}
行程間不同享全域變數
# -*- coding:utf-8 -*- from multiprocessing import Process import os import time nums = [11, 22] def work1(): """子行程要執行的代碼""" print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums)) for i in range(3): nums.append(i) time.sleep(1) print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums)) def work2(): """子行程要執行的代碼""" print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums)) if __name__ == '__main__': p1 = Process(target=work1) p1.start() p1.join() p2 = Process(target=work2) p2.start() 運行結果: in process1 pid=11349 ,nums=[11, 22] in process1 pid=11349 ,nums=[11, 22, 0] in process1 pid=11349 ,nums=[11, 22, 0, 1] in process1 pid=11349 ,nums=[11, 22, 0, 1, 2] in process2 pid=11350 ,nums=[11, 22]
行程間通信-Queue
可以使用multiprocessing模塊的Queue實作多行程之間的資料傳遞,Queue本身是一個訊息列隊程式,
我們以Queue為例,在父行程中創建兩個子行程,一個往Queue里寫資料,一個從Queue里讀資料:
from multiprocessing import Process, Queue import os, time, random # 寫資料行程執行的代碼: def write(q): for value in ['A', 'B', 'C']: print('Put %s to queue...' % value) q.put(value) time.sleep(random.random()) # 讀資料行程執行的代碼: def read(q): while True: if not q.empty(): value = q.get(True) print('Get %s from queue.' % value) time.sleep(random.random()) else: break if __name__=='__main__': # 父行程創建Queue,并傳給各個子行程: q = Queue() pw = Process(target=write, args=(q,)) pr = Process(target=read, args=(q,)) # 啟動子行程pw,寫入: pw.start() # 等待pw結束: pw.join() # 啟動子行程pr,讀取: pr.start() pr.join() # pr行程里是死回圈,無法等待其結束,只能強行終止: print('') print('所有資料都寫入并且讀完') """ 輸入如下: Put A to queue... Put B to queue... Put C to queue... Get A from queue. Get B from queue. Get C from queue. 所有資料都寫入并且讀完 """
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238894.html
標籤:Python
