【发布时间】:2015-08-23 11:35:13
【问题描述】:
我知道这个问题相当高级,可能含糊不清。请询问您是否需要更多详细信息,我会尝试编辑。
我正在使用 QuickFix 和 Python 绑定来同时使用来自大约 30 个市场的高吞吐量市场数据。大多数计算工作是通过multiprocessing 模块在单独的CPU 中完成的。这些并行进程由主进程在启动时产生。如果我希望通过QuickFix 以任何方式与市场互动,我必须在主进程中执行此操作,因此来自子进程的任何命令(例如输入订单)都必须通过管道传输(通过@ 987654328@ 对象我们将在执行前调用Q) 到主进程。
这引发了监控Q 的问题,这必须在主进程中完成。我不能使用Q.get(),因为此方法会阻塞,并且我的整个主进程将挂起,直到Q 中出现某些内容。为了减少延迟,我必须经常检查Q,大约每秒 50 次。我一直在使用apscheduler 来执行此操作,但我不断收到警告错误,指出错过了运行时。这些错误是一个严重的问题,因为它们使我无法轻松查看重要信息。
因此,我重构了我的应用程序以使用 MestreLion 发布的代码作为对 this question 的回答。这对我有用,因为它从主进程启动一个新线程,并且不打印错误消息。但是,我担心这会在未来造成严重的问题。
我知道 python 中的全局解释器锁(这就是我开始使用multiprocessing 模块的原因),但我不太了解它。由于我的应用程序的高频特性,我不知道Q监控线程和消耗大量传入消息的主进程是否会竞争资源并相互减慢。
我的问题:
在这种情况下我可能会遇到麻烦吗?
如果没有,我可以使用当前方法添加更多监控线程并且仍然可以吗?至少还有两件事我想高频监控。
谢谢。
【问题讨论】:
-
Queue.get有一个阻塞参数,如果指定为False将不阻塞,但引发异常,您可以轻松捕获。你试过吗?另外,你能限定“高频”吗?是你之前提到的30hz吗?那么恕我直言,您应该没有问题,即使监控三个来源。 -
我的数据提供者有一些限制,我认为大约是 18-30 毫秒。这大约是每个市场消息之间的最短时间。在繁忙时期,这是相当数量的数据。至于我自己的监控,我提到了 50hz,而不是 30,但是是的,我认为这对我来说可能已经足够了。
-
帮助你理解 Python 中的并发,观看David Beazley - Python Concurrency From the Ground Up: LIVE! - PyCon 2015
-
那么我真的怀疑你会遇到任何问题。顺便说一句,您如何将事件传播到主循环中?
-
@deets 由于某种原因使用线程时,我不需要传播到主循环中。如果我在
Q中得到任何东西,我可以直接从检查Q的监控程序中调用方法(如发送订单)。
标签: python multithreading multiprocessing quickfix gil