首页 > 解决方案 > 线程、多处理或异步,什么适合我的项目?

问题描述

我正在开发一个金融应用程序,它(间接)使用 websocket-client 每秒从 NseIndia 接收实时信息。

程序结构由多个并行运行的Task组成。

所有这些任务都需要同时实时提供各种符号。

每个符号都是一个 Python 对象,其中包含请求该符号的任务列表。

饲料源模块每秒接收数百个饲料。它有一个方法“distribute()”,可以分离传入的提要并将其发送到相应的符号。然后,符号会进一步将提要重新分配给所有需要它的任务。

为了实现这种并行性,我一直在使用 python 线程模块的线程。

问题是 CPU 一次不能处理超过 1000 个线程,抛出一个

"RuntimeError: can't start new thread"

完整追溯:

Exception in thread Thread-6542:
Traceback (most recent call last):
  File "C:\Users\PC2\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Users\PC2\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\PC2\PycharmProjects\Feedtest2\Arena\Cerebelle.py", line 49, in quote_distribute
    inx.feed(quote)
  File "C:\Users\PC2\PycharmProjects\Feedtest2\Arena\Instrument.py", line 23, in feed
    Thread(target=sprite.feed, args=(quote,), daemon=True).start()
  File "C:\Users\PC2\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 847, in start
    _start_new_thread(self._bootstrap, ())
RuntimeError: can't start new thread

请提出解决方法或替代方法!

谢谢你!

工作流程的图示

标签: pythonmultithreadingmultiprocessingpython-asyncio

解决方案


您可以使用消息系统(如 RabbitMQ、Apache Kafka),而不是拥有这么多线程。将您从 websocket 获得的消息推送到适当的队列,然后一个或多个单独的工作进程可以按照收到的顺序处理它们。


推荐阅读