我正在开发一个项目,我有一个数据库,可以向我的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()
。
谢谢!
答案 0 :(得分:0)
不确定此特定图表的工作原理。但我看到你启动线程,但不加入它们。在加入之前,线程将被处理并标记为未完成(尽管未执行)。您应该在某处实现thr.join()
以实际完成它们并防止资源泄漏。为此,您必须跟踪它们,这使代码更复杂。
尝试使用未记录的multiprocessing.pool.ThreadPool
,它与from multiprocessing.Pool
具有相同的签名,但可以使用线程。它可以运行有限的工作线程池,并在其中执行任务(或将m放入队列)。请参阅:https://docs.python.org/2/library/multiprocessing.html