Вам нужно проанализировать, почему ваша программа замедляется, когда другие потоки выполняют свою работу. Предполагая, что потоки выполняют интенсивную работу с процессором, замедление согласуется с тем, что потоки сериализуются с помощью глобальной блокировки интерпретатора.
Невозможно ответить в деталях, не зная больше о характере работы, которую выполняют ваши потоки, и об объектах, которые должны совместно использоваться параллельно. В общем, у вас есть два жизнеспособных варианта:
Использовать процессы, как правило, через модуль многопроцессорности. Типичные причины, по которым объекты не разборчивы, состоят в том, что они содержат неуправляемое состояние, такое как закрытие, открытые дескрипторы файлов или другие системные ресурсы. Но pickle позволяет объектам реализовывать такие методы, как __getstate__
или __reduce__
, которые определяют состояние объекта, используя состояние для восстановления объектов. Если ваши объекты являются непригодными, потому что они огромны, вам может потребоваться написать расширение C, которое хранит их в общей памяти или файле с отображением памяти, и рассолить только ключ, который идентифицирует их в общей памяти.
Используйте темы, найдя способы работы с GIL. Если ваши вычисления сосредоточены в нескольких горячих точках, вы можете переместить эти горячие точки на C и отпустить GIL на время вычисления. Чтобы это сработало, вычисление не должно ссылаться на какие-либо объекты Python, то есть все данные должны быть извлечены из объектов, в то время как GIL удерживается, и сохраняется в мире Python после того, как GIL был повторно обнаружен.
Будут ли какие-либо из них работать с незащищенными объектами? – user4815162342