python多工的導包問題
多執行緒的使用:
import threading
def func(x): print(x) t= threading.Thread(target=func,args=(12,)) # 執行緒啟動 t.start() # 主程序阻塞,等待子程序的退出 t.join() # 設定執行緒為主執行緒的守護執行緒 t.setDaemon()
多程序的使用 from multiprocessing import Process def func(x): print(x) p = Process(target=func,args=(12,)) p.start()# 啟動子程序例項(建立子程序)
執行緒池、程序池的使用: # 程序池 from multiprocessing import Pool
# 執行緒池 from multiprocessing.dummy import Pool pool = Pool(5) # 同時最大執行執行緒或者程序個數
def _excute(x,y): print(x+y) def _callback(self, temp): # temp必有引數
pool.apply_async(target=_excute, callback=_callback) poll.close()# 關閉Pool,使其不再接受新的任務; poll.terminate()# 不管任務是否完成,立即終止; poll.join()# 主程序阻塞,等待子程序的退出,必須在close或terminate之後使用
程序或者執行緒的間通訊工具--Queue
# 執行緒池、多執行緒 使用的Queue from queue import Queue
# 多程序使用的queue from multiprocessing import JoinableQueue as Queue
# 程序池使用的queue from multiprocessing import Manager
queue = Manager().Queue() queue = Queue()
queue.qsize()# 返回當前佇列包含的訊息數量。 queue.empty()# 如果佇列為空,返回True,反之False。 queue.full()# 如果佇列滿了,返回True,反之False。 queue.put(item, block=True, timeout=None)
將item訊息寫入佇列,block預設值為True; 如果block使用預設值,且沒有設定timeout(單位秒),訊息列隊如果已經沒有空間可寫入,此時程式將被阻塞(停 在寫入狀態),直到從訊息列隊騰出空間為止,如果設定了timeout,則會等待timeout秒,若還沒空間,則拋 出"Queue.Full"異常; 如果block值為False,訊息列隊如果沒有空間可寫入,則會立刻丟擲"Queue.Full"異常;
queue.get(item, block=True, timeout=None) 獲取佇列中的一條訊息,然後將其從佇列中移除,block預設值為True。如果block使用預設值,且沒有設定 timeout(單位秒),訊息列隊如果為空,此時程式將被阻塞(停在讀取狀態),直到從訊息列隊讀到訊息為止,如果 設定了timeout,則會等待timeout秒,若還沒讀取到任何訊息,則丟擲"Queue.Empty"異常; 如果block值為False,訊息列隊如果為空,則會立刻丟擲"Queue.Empty"異常; # get方法並不能讓queue的計數-1,必須呼叫task_done queue.task_done()