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()
python多任務的導包問題