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

Я реализовал серверную программу, используя Twisted. Я использую twisted.protocols.basic.LineReceiver вместе с twisted.internet.protocol.ServerFactory.

Я хотел бы, чтобы каждый клиент, который подключается к серверу, выполнял набор функций параллельно (я думаю о многопоточности для этого).

У меня есть некоторая путаница с использованием twisted.internet.threads.deferToThread для этой проблемы.

  1. Должен ли я позвонить deferToThread в ServerFactory для этой цели?
  2. Являются ли скрученные потоки потокобезопасными в отношении условий гонки?
  3. Ранее я пытался использовать multiprocessing в своей серверной программе, но, похоже, он не работал в сочетании с Twisted Reaker, в то время как deferToThread выполнял свою работу.

Мне интересно, как реализованы Twisted threads? Разве они не используют multiprocessing?


person user823743    schedule 23.12.2014    source источник


Ответы (1)


  1. Раньше я пытался использовать многопроцессорность в своей серверной программе, но, похоже, она не работала в сочетании с реактором Twisted, в то время как deferToThread выполнял свою работу. Мне интересно, как реализованы Twisted threads? Разве они не используют многопроцессорность?

Вы не сказали, использовали ли вы многопоточную версию многопроцессорной обработки или многопроцессорную версию многопроцессорной обработки.

Однако вы можете прочитать о смешивании Twisted и многопроцессорности в Stack Overflow:

Смешать Python Twisted с многопроцессорностью? Twisted network client с многопроцессорными рабочими процессами? несовместим с многопроцессорными событиями и очередями?

(И больше)

Чтобы ответить на более короткую часть этого вопроса — нет, Twisted не использует пакет stdlib multiprocessing для реализации своих потоковых API. Он использует модуль stdlib threading.

  1. Являются ли скрученные потоки потокобезопасными в отношении условий гонки?

Ответ на это вытекает из ответа выше: нет. "Скрученные нити" на самом деле не вещь. API-интерфейсы потоковой обработки Twisted — это просто слой поверх модуля stdlib threading (который на самом деле представляет собой просто API Python для потоков POSIX (или что-то похожее, но другое в Windows). API-интерфейсы потоковой обработки Twisted не устраняют волшебным образом возможность возникновения условий гонки (если в Twisted и есть какое-то волшебство, так это способность делать определенные вещи одновременно, без вообще использования потоков, что помогает уменьшить количество условий гонки в вашей программе, хотя и не устраняет полностью возможность их создания).

  1. Должен ли я позвонить deferToThread в ServerFactory для этой цели?

Я не совсем уверен, в чем смысл этого вопроса. Вам интересно, является ли метод вашего подкласса ServerFactory лучшим местом для вызовов deferToThread? Вероятно, это зависит от деталей вашего подхода к реализации. Хотя, наверное, в целом это не имеет большого значения. Если вам нравится модель, когда фабрика предоставляет услуги экземплярам протокола, дерзайте.

person Jean-Paul Calderone    schedule 23.12.2014