2013-08-26 2 views
2

Я создаю простую многопользовательскую игру на питоне. Я разделил процессы с помощью модуля потоков по умолчанию в python. Однако я заметил, что программа по-прежнему замедляется со скоростью других потоков. Я попытался использовать модуль многопроцессорности, но не все мои объекты можно мариновать.Python 2.7.5 - Запуск нескольких потоков одновременно без замедления

Существует ли альтернатива использованию многопроцессорного модуля для одновременного запуска процессов?

ответ

0

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

Невозможно ответить в деталях, не зная больше о характере работы, которую выполняют ваши потоки, и об объектах, которые должны совместно использоваться параллельно. В общем, у вас есть два жизнеспособных варианта:

  1. Использовать процессы, как правило, через модуль многопроцессорности. Типичные причины, по которым объекты не разборчивы, состоят в том, что они содержат неуправляемое состояние, такое как закрытие, открытые дескрипторы файлов или другие системные ресурсы. Но pickle позволяет объектам реализовывать такие методы, как __getstate__ или __reduce__, которые определяют состояние объекта, используя состояние для восстановления объектов. Если ваши объекты являются непригодными, потому что они огромны, вам может потребоваться написать расширение C, которое хранит их в общей памяти или файле с отображением памяти, и рассолить только ключ, который идентифицирует их в общей памяти.

  2. Используйте темы, найдя способы работы с GIL. Если ваши вычисления сосредоточены в нескольких горячих точках, вы можете переместить эти горячие точки на C и отпустить GIL на время вычисления. Чтобы это сработало, вычисление не должно ссылаться на какие-либо объекты Python, то есть все данные должны быть извлечены из объектов, в то время как GIL удерживается, и сохраняется в мире Python после того, как GIL был повторно обнаружен.

Смежные вопросы