Какой модуль потоков следует использовать, чтобы не допустить, чтобы дисковый ввод-вывод блокировал сетевой ввод-вывод? - PullRequest
5 голосов
/ 17 октября 2010

У меня есть приложение Python, которое, если быть кратким, получает данные с удаленного сервера, обрабатывает их, отвечает на сервер и иногда сохраняет обработанные данные на диск.Проблема, с которой я столкнулся, заключается в том, что для записи требуется много данных, и процесс сохранения может занять более полминуты.По-видимому, это операция блокировки, поэтому сетевой ввод-вывод в это время останавливается.Мне бы хотелось, чтобы операция сохранения выполнялась в фоновом режиме, так сказать, чтобы приложение могло продолжать достаточно быстро обмениваться данными с сервером.

Я знаю, что мне, вероятно, нужнокакой-то модуль потоков для этого, но я не могу сказать, в чем разница между thread, threading, multiprocessing и различными другими опциями.Кто-нибудь знает, что я ищу?

1 Ответ

6 голосов
/ 17 октября 2010

Поскольку вы привязаны к вводу / выводу, используйте модуль threading.

Вы почти никогда не должны использовать thread, это низкоуровневый интерфейс; модуль threading является интерфейсной оболочкой высокого уровня для thread.

Модуль multiprocessing отличается от модуля потоков, multiprocessing использует несколько подпроцессов для выполнения задачи; multiprocessing просто использует тот же интерфейс, что и threading, чтобы уменьшить кривую обучения. multiprocessing обычно используется, когда у вас есть расчёт привязки к ЦП, и вам нужно избегать GIL (Global Interpreter Lock) в многоядерном ЦП.

Несколько более эзотерической альтернативой многопоточности является асинхронный ввод-вывод с использованием модуля asyncore. Другие опции включают в себя Stackless Python и Twisted.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...