[英]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,並發現了並發圖。 但是當我運行它時,似乎發生了一些奇怪的事情。
這里的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.