1. 程式人生 > >python多工的導包問題

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()# 啟動子程序例項(建立子程序)

  p.is_alive()# 判斷程序子程序是否還在活著  p.join(timeout)# 是否等待子程序執行結束,或者等待多少秒  p.terminate()# 不管任務是否完成,立即終止子程序  p.daemon = True # 設定守護程序

執行緒池、程序池的使用:  # 程序池  from multiprocessing import Pool

  # 執行緒池  from multiprocessing.dummy import Pool  pool = Pool(5) # 同時最大執行執行緒或者程序個數

  def _excute(x,y):    print(x+y)  def _callback(self, temp): # temp必有引數

    print("執行緒或程序任務完成後的回撥")

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