Threading, Multiprocessing или Asyncio, что подходит моему проекту? - PullRequest
1 голос
/ 28 мая 2020

Я разрабатываю финансовое приложение, которое (косвенно) получает прямую трансляцию из NseIndia каждую секунду с помощью websocket-client.

Структура программы состоит из нескольких задач, выполняемых параллельно.

Все эти задачи требуют одновременной трансляции различных символов в реальном времени.

Каждый символ - это Python объект, содержащий список задач, которые запросили этот символ.

Модуль источника потока получает сотни кормлений каждую секунду. У него есть метод distribute (), который разделяет входящий канал и отправляет его соответствующему символу. Затем символ перераспределяет канал для всех задач, которые в нем нуждаются.

Для достижения такого параллелизма я использовал потоки модуля потоковой передачи python.

Проблема в том, что ЦП не может обрабатывать более 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

Пожалуйста, предложите решение или альтернативный способ сделай это!

Спасибо!

Наглядное представление рабочего процесса

1 Ответ

0 голосов
/ 28 мая 2020

Вместо множества потоков вы можете использовать систему сообщений (например, RabbitMQ, Apache Kafka). Pu sh сообщения, которые вы получаете из своего веб-сокета, в соответствующую очередь, а затем один или несколько отдельных рабочих процессов могут обрабатывать их в том порядке, в котором они были получены.

...