簡體   English   中英

在Python中限制線程

[英]Limiting threads in Python

我正在一個項目中,我有一個向Python應用程序發送信息的數據庫。 每當我的Python腳本收到這樣的“事件”時,它都必須處理數據,但也要准備接收新的事件。

在運行時,腳本將在幾毫秒內接收到許多事件,因此無法進行串行處理。

下面一些偽代碼來說明我當前的設置:

class Source(Thread):
# receives events and dispatches to processing threads

run():
    while True:
        data = database.receive
        for thing in data:
            DataProcessing.process(thing)

class DataProcessing():

    @Multitasking.threaded
    @staticmethod
    process(foo):
      do_something

class Multitasking():
def threaded(fn):
    def wrapper(*args, **kwargs):
        thread = Thread(target=fn, args=args, kwargs=kwargs)
        thread.setDaemon(True)
        thread.setName('worker')
        thread.start()
        return thread
    return wrapper

因此,這里有一個Source類,它充當數據庫事件的偵聽器。 每當有事件發生時,它都會使用DataProcessing.process()方法處理該事件。 我編寫了一個裝飾器/包裝器以使其成為線程,以便Source可以返回監聽狀態。

現在這是我的問題:我使用pycharm,並發現了並發圖。 但是當我運行它時,似乎發生了一些奇怪的事情。

concurrency_diagram 這里的worker是上面提到的processing()方法。 如您所見,對於每個接收到的事件,活動線程的數量越來越大,而我確定data數組的大小不會越來越大。

我的問題:此圖如何工作? 看起來每次接收到事件時都會重新啟動線程,但這是嗎? 我只為新事件調用thread.start()

謝謝!

不確定此特定圖表的工作方式。 但是我看到您啟動了線程,但沒有加入它們。 在加入之前,線程將被視為未完成(盡管未執行)並被標記為未完成。 您應該在某個地方執行thr.join()以實際完成它們並防止資源泄漏。 為此,您必須跟蹤它們,這會使代碼更加復雜。

嘗試使用未記錄的multiprocessing.pool.ThreadPool ,它具有與from multiprocessing.Pool相同的簽名,但是可以與線程一起使用。 它可以運行有限數量的工作線程池,並在其中執行任務(或將m放入隊列)。 參見: https : //docs.python.org/2/library/multiprocessing.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM