Является ли Python cStringIO поточно-ориентированным? - PullRequest
3 голосов
/ 13 мая 2011

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

Спасибо.

Ответы [ 4 ]

5 голосов
/ 13 мая 2011

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

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

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

3 голосов
/ 13 мая 2011

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

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

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

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

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

0 голосов
/ 13 мая 2011

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

0 голосов
/ 13 мая 2011

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

...