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

python多任務的導包問題

lse 是否 pan sta multi 如果 ali false call

多線程的使用:

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

python多任務的導包問題