摘要:,,等實用方法可以獲取一個隊列的當前大小和狀態。但要注意,這些方法都不是線程安全的。可能你對一個隊列使用判斷出這個隊列為空,但同時另外一個線程可能已經向這個隊列中插入一個數據項。
python 多線程編程 使用回調方式
import time def countdown(n): while n > 0: print("T-minus", n) n -= 1 time.sleep(5) # Create and launch a thread from threading import Thread t = Thread(target=countdown, args=(10,)) t.start()把線程放入一個類
from threading import Thread class CountdownTask: def __init__(self): self._running = True def terminate(self): self._running = False def run(self, n): while self._running and n > 0: print("T-minus", n) n -= 1 time.sleep(5) c = CountdownTask() t = Thread(target=c.run, args=(10,)) t.start() c.terminate() # Signal termination t.join() # Wait for actual termination (if needed)
注意使用變量 self._running 退出線程的方式
使用繼承方式from threading import Thread
class CountdownThread(Thread):
def __init__(self, n): super().__init__() self.n = n def run(self): while self.n > 0: print("T-minus", self.n) self.n -= 1 time.sleep(5)
c = CountdownThread(5)
c.start()
import Queue import threading import time task_queue = Queue.Queue() class ThreadTest(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): while True: msg = self.queue.get() print(msg) time.sleep(0.1) self.queue.task_done() def main(): start = time.time() # populate queue with data for i in range(100): task_queue.put("message") # spawn a pool of threads, and pass them queue instance for i in range(5): t = ThreadTest(task_queue) t.setDaemon(True) t.start() # wait on the queue until everything has been processed task_queue.join() print "Elapsed Time: {}".format(time.time() - start) if __name__ == "__main__": main()
setDaemon 設置為 True, run 函數中不需要退出,主線程結束后所有子線程退出
如果 setDaemon 設置為 False,則改為
def run(self): while not self.queue.empty(): msg = self.queue.get() print(msg) time.sleep(0.1) self.queue.task_done()
并且在主函數結束前 join 所有線程
注意
向隊列中添加數據項時并不會復制此數據項,線程間通信實際上是在線程間傳遞對象引用。如果你擔心對象的共享狀態,那你最好只傳遞不可修改的數據結構(如:整型、字符串或者元組)或者一個對象的深拷貝。
from queue import Queue from threading import Thread import copy # A thread that produces data def producer(out_q): while True: # Produce some data ... out_q.put(copy.deepcopy(data)) # A thread that consumes data def consumer(in_q): while True: # Get some data data = in_q.get() # Process the data ...
q.qsize() , q.full() , q.empty() 等實用方法可以獲取一個隊列的當前大小和狀態。但要注意,這些方法都不是線程安全的。可能你對一個隊列使用 empty() 判斷出這個隊列為空,但同時另外一個線程可能已經向這個隊列中插入一個數據項。
參考python3-cookbook Chapter 12 "Concurrency-Starting and Stopping Threads"
Practical threaded programming with Python
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45007.html
摘要:使用進行并發編程篇三掘金這是使用進行并發編程系列的最后一篇。所以我考慮啟用一個本地使用進行并發編程篇二掘金我們今天繼續深入學習。 使用 Python 進行并發編程 - asyncio 篇 (三) - 掘金 這是「使用Python進行并發編程」系列的最后一篇。我特意地把它安排在了16年最后一天。 重新實驗上篇的效率對比的實現 在第一篇我們曾經對比并發執行的效率,但是請求的是httpb...
摘要:本文最先發布在博客這篇文章將講解并發編程的基本操作。并發是指能夠多任務處理,并行則是是能夠同時多任務處理。雖然自帶了很好的類庫支持多線程進程編程,但眾所周知,因為的存在,很難做好真正的并行。 本文最先發布在博客:https://blog.ihypo.net/151628... 這篇文章將講解 Python 并發編程的基本操作。并發和并行是對孿生兄弟,概念經常混淆。并發是指能夠多任務處...
摘要:擴展支持多用戶并發訪問與線程池。項目請見初學網絡編程之服務器。不允許超過磁盤配額。該文件是一個使用模塊編寫的線程池類。這一步就做到了線程池的作用。 對MYFTP項目進行升級。擴展支持多用戶并發訪問與線程池。MYFTP項目請見python初學——網絡編程之FTP服務器。 擴展需求 1.在之前開發的FTP基礎上,開發支持多并發的功能2.不能使用SocketServer模塊,必須自己實現多線...
摘要:也提供多線程支持,而且中的線程并非是模擬出來的多線程,而是系統級別的標準庫提供了兩個模塊和。同一個變量,線程則會互相共享。例如多個線程對銀行中的某一個賬戶進行操作。但是實際情況是隨意切換線程。說到的多線程編程,就會繞不過。 該文章參考了http://www.liaoxuefeng.com/wi... 廖雪峰的教程。 一個進程至少有一個線程。Python也提供多線程支持,而且Python...
閱讀 786·2021-08-23 09:46
閱讀 928·2019-08-30 15:44
閱讀 2586·2019-08-30 13:53
閱讀 3039·2019-08-29 12:48
閱讀 3847·2019-08-26 13:46
閱讀 1780·2019-08-26 13:36
閱讀 3510·2019-08-26 11:46
閱讀 1408·2019-08-26 10:48