Является ли itertools поточно-ориентированным? - PullRequest
14 голосов
/ 16 августа 2011

Например, если я создаю итератор, используя chain, могу ли я вызвать его в нескольких потоках?Обратите внимание, что потокобезопасность, основанная на GIL, является приемлемой, но не предпочтительной.

(Обратите внимание, что это немного отличается от этого вопроса , который касается генераторов, а не итераторов, написанных наC).

1 Ответ

13 голосов
/ 16 августа 2011

Во-первых, в официальной документации itertools ничего не говорится о том, что они поточнобезопасны. Похоже, что по спецификации Python ничего не гарантирует по этому поводу. Это может отличаться в разных реализациях, таких как Jython или PyPy, но это означает, что ваш код, вероятно, не будет переносимым.

Во-вторых, большинство itertools (за исключением простых, таких как count) принимают другие итераторы в качестве входных данных. Вам понадобятся эти итераторы для правильного поведения в поточно-ориентированном режиме.

В-третьих, некоторые итераторы могут не иметь смысла при одновременном использовании разными потоками. Например, izip, работающий в нескольких потоках, может попасть в состояние гонки, принимая элементы из нескольких источников, особенно в соответствии с определением эквивалентного кода Python (что произойдет, когда одному потоку удастся получить значение только из одного входного итератора, а затем второй поток из двух из них?).

Также обратите внимание, что в документации не упоминается, что itertools реализованы на C. Мы знаем (как подробности реализации), что itertools CPython фактически написаны на C, но в других реализациях они могут быть успешно реализованы как генераторы. и вы можете вернуться к вопросу, который вы цитировали .

Итак, нет, вы не можете предполагать, что они являются поточно-ориентированными, если не знаете подробностей реализации вашей целевой платформы python.

...