Является ли Python cStringIO поточно-ориентированным?

Как говорит заголовок, защищает ли Python cStringIO свои внутренние структуры для многопоточности?

Спасибо.

4 ответа

Решение

Посмотрите на отличную работу по объяснению GIL, затем обратите внимание, что cStringIO написан исключительно на C, и его вызовы не выпускают GIL.

Это означает, что работающий поток не будет добровольно переключаться во время read()/write() (с текущей реализацией виртуальной машины). (ОС будет вытеснять поток, однако другие потоки Python не смогут получить GIL.)

Взгляните на источник: Python-2.7.1/Modules/cStringIO.c, здесь нет упоминания о защите внутренних устройств. Если есть сомнения, посмотрите на источник:)

Я предполагаю, что вы говорите о реализации Python на CPython.

В CPython есть глобальная блокировка интерпретатора, которая означает, что одновременно может выполняться только один поток кода Python. Поэтому код, написанный на C, также будет эффективно однопоточным, если он явно не снимет глобальную блокировку.

Это означает, что если у вас есть несколько потоков Python, все из которых используют cStringIO одновременно, проблем не будет, поскольку одновременно может быть активен только один вызов метода cStringIO, и cStringIO никогда не снимает блокировку. Однако, если вы вызываете его непосредственно из кода C, который выполняется вне заблокированной среды, у вас будут проблемы. Также, если вы делаете что-то более сложное, чем просто чтение или письмо, у вас будут проблемы, например, если вы начнете использовать seek поскольку ваши звонки могут перекрываться неожиданными способами.

Также обратите внимание, что некоторые методы, такие как writelines может вызывать код Python из метода, так что в этом случае вы можете получить другие выходные данные, чередующиеся внутри одного вызова writelines,

Это верно для большинства стандартных объектов Python: вы можете безопасно использовать объекты из нескольких потоков, поскольку отдельные операции не прервутся, но порядок, в котором происходят события, не будет определен.

Он настолько же "потокобезопасен", насколько могут быть файловые операции (что означает - не так много). Реализация Python, которую вы используете, имеет глобальную блокировку интерпретатора (GIL), которая гарантирует, что каждая отдельная файловая операция на cStringIO не будет прерван другим потоком. Это, однако, не гарантирует, что параллельные файловые операции из нескольких потоков не будут чередоваться.

Нет, в настоящее время это не потокобезопасно.

Другие вопросы по тегам