成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python 多線程編程

dreamGong / 2468人閱讀

摘要:,,等實(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()

使用 Queue 進(jìn)行線程間通信
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

相關(guān)文章

  • 使用 Python 進(jìn)行并發(fā)編程系列 - 收藏集 - 掘金

    摘要:使用進(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...

    MorePainMoreGain 評(píng)論0 收藏0
  • Python

    摘要:最近看前端都展開了幾場(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ǔ)大概也就夠用了...

    dailybird 評(píng)論0 收藏0
  • Python 的并發(fā)編程

    摘要:本文最先發(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ù)處...

    happen 評(píng)論0 收藏0
  • python初學(xué)——網(wǎng)絡(luò)編程之FTP服務(wù)器支持并發(fā)版本

    摘要:擴(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)多線...

    oysun 評(píng)論0 收藏0
  • python學(xué)習(xí)筆記- 線程

    摘要:也提供多線程支持,而且中的線程并非是模擬出來(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...

    RiverLi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<