摘要:,,等實(shí)用方法可以獲取一個(gè)隊(duì)列的當(dāng)前大小和狀態(tài)。但要注意,這些方法都不是線程安全的??赡苣銓?duì)一個(gè)隊(duì)列使用判斷出這個(gè)隊(duì)列為空,但同時(shí)另外一個(gè)線程可能已經(jīng)向這個(gè)隊(duì)列中插入一個(gè)數(shù)據(jù)項(xiàng)。
python 多線程編程 使用回調(diào)方式
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()把線程放入一個(gè)類
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 設(shè)置為 True, run 函數(shù)中不需要退出,主線程結(jié)束后所有子線程退出
如果 setDaemon 設(shè)置為 False,則改為
def run(self): while not self.queue.empty(): msg = self.queue.get() print(msg) time.sleep(0.1) self.queue.task_done()
并且在主函數(shù)結(jié)束前 join 所有線程
注意
向隊(duì)列中添加數(shù)據(jù)項(xiàng)時(shí)并不會(huì)復(fù)制此數(shù)據(jù)項(xiàng),線程間通信實(shí)際上是在線程間傳遞對(duì)象引用。如果你擔(dān)心對(duì)象的共享狀態(tài),那你最好只傳遞不可修改的數(shù)據(jù)結(jié)構(gòu)(如:整型、字符串或者元組)或者一個(gè)對(duì)象的深拷貝。
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() 等實(shí)用方法可以獲取一個(gè)隊(duì)列的當(dāng)前大小和狀態(tài)。但要注意,這些方法都不是線程安全的??赡苣銓?duì)一個(gè)隊(duì)列使用 empty() 判斷出這個(gè)隊(duì)列為空,但同時(shí)另外一個(gè)線程可能已經(jīng)向這個(gè)隊(duì)列中插入一個(gè)數(shù)據(jù)項(xiàng)。
參考python3-cookbook Chapter 12 "Concurrency-Starting and Stopping Threads"
Practical threaded programming with Python
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/45007.html
摘要:使用進(jìn)行并發(fā)編程篇三掘金這是使用進(jìn)行并發(fā)編程系列的最后一篇。所以我考慮啟用一個(gè)本地使用進(jìn)行并發(fā)編程篇二掘金我們今天繼續(xù)深入學(xué)習(xí)。 使用 Python 進(jìn)行并發(fā)編程 - asyncio 篇 (三) - 掘金 這是「使用Python進(jìn)行并發(fā)編程」系列的最后一篇。我特意地把它安排在了16年最后一天。 重新實(shí)驗(yàn)上篇的效率對(duì)比的實(shí)現(xiàn) 在第一篇我們?cè)?jīng)對(duì)比并發(fā)執(zhí)行的效率,但是請(qǐng)求的是httpb...
摘要:最近看前端都展開了幾場(chǎng)而我大知乎最熱語(yǔ)言還沒有相關(guān)。有關(guān)書籍的介紹,大部分截取自是官方介紹。但從開始,標(biāo)準(zhǔn)庫(kù)為我們提供了模塊,它提供了和兩個(gè)類,實(shí)現(xiàn)了對(duì)和的進(jìn)一步抽象,對(duì)編寫線程池進(jìn)程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進(jìn)階的書, 里面介紹的基本都是高級(jí)的python用法. 對(duì)于初學(xué)python的人來(lái)說, 基礎(chǔ)大概也就夠用了...
摘要:本文最先發(fā)布在博客這篇文章將講解并發(fā)編程的基本操作。并發(fā)是指能夠多任務(wù)處理,并行則是是能夠同時(shí)多任務(wù)處理。雖然自帶了很好的類庫(kù)支持多線程進(jìn)程編程,但眾所周知,因?yàn)榈拇嬖?,很難做好真正的并行。 本文最先發(fā)布在博客:https://blog.ihypo.net/151628... 這篇文章將講解 Python 并發(fā)編程的基本操作。并發(fā)和并行是對(duì)孿生兄弟,概念經(jīng)常混淆。并發(fā)是指能夠多任務(wù)處...
摘要:擴(kuò)展支持多用戶并發(fā)訪問與線程池。項(xiàng)目請(qǐng)見初學(xué)網(wǎng)絡(luò)編程之服務(wù)器。不允許超過磁盤配額。該文件是一個(gè)使用模塊編寫的線程池類。這一步就做到了線程池的作用。 對(duì)MYFTP項(xiàng)目進(jìn)行升級(jí)。擴(kuò)展支持多用戶并發(fā)訪問與線程池。MYFTP項(xiàng)目請(qǐng)見python初學(xué)——網(wǎng)絡(luò)編程之FTP服務(wù)器。 擴(kuò)展需求 1.在之前開發(fā)的FTP基礎(chǔ)上,開發(fā)支持多并發(fā)的功能2.不能使用SocketServer模塊,必須自己實(shí)現(xiàn)多線...
摘要:也提供多線程支持,而且中的線程并非是模擬出來(lái)的多線程,而是系統(tǒng)級(jí)別的標(biāo)準(zhǔn)庫(kù)提供了兩個(gè)模塊和。同一個(gè)變量,線程則會(huì)互相共享。例如多個(gè)線程對(duì)銀行中的某一個(gè)賬戶進(jìn)行操作。但是實(shí)際情況是隨意切換線程。說到的多線程編程,就會(huì)繞不過。 該文章參考了http://www.liaoxuefeng.com/wi... 廖雪峰的教程。 一個(gè)進(jìn)程至少有一個(gè)線程。Python也提供多線程支持,而且Python...
閱讀 797·2021-08-23 09:46
閱讀 946·2019-08-30 15:44
閱讀 2604·2019-08-30 13:53
閱讀 3050·2019-08-29 12:48
閱讀 3873·2019-08-26 13:46
閱讀 1807·2019-08-26 13:36
閱讀 3520·2019-08-26 11:46
閱讀 1419·2019-08-26 10:48