限制Python中的线程

时间:2017-10-01 13:08:41

标签: python multithreading concurrency pycharm

我正在开发一个项目,我有一个数据库,可以向我的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()

谢谢!

1 个答案:

答案 0 :(得分:0)

不确定此特定图表的工作原理。但我看到你启动线程,但不加入它们。在加入之前,线程将被处理并标记为未完成(尽管未执行)。您应该在某处实现thr.join()以实际完成它们并防止资源泄漏。为此,您必须跟踪它们,这使代码更复杂。

尝试使用未记录的multiprocessing.pool.ThreadPool,它与from multiprocessing.Pool具有相同的签名,但可以使用线程。它可以运行有限的工作线程池,并在其中执行任务(或将m放入队列)。请参阅:https://docs.python.org/2/library/multiprocessing.html