LINUX.ORG.RU

Python и потоки


0

0

Почитав про Python и GIL решил написать тестовую многопоточную программу. Все что делает програмка - это в 2 потока печатает на stdout. Перенаправив вывод в файл и просмотрев потом содержимое файла сложилось впечатление что потоки работают поочереди, но не одновременно (в файле поочереди достаточно большими блоками идет вывод одного потока, потом другого и т.д.).
Написав аналогичную программу на С получил достаточно равномерное распределение вывода 2-х потоков (одна строка - один поток, следующая - другой и т.д.). То есть хорошо видно что потоки действительно работают одновременно.
Да кстати машина - кора дуба 2.

Так вот неужели в питоне все так плохо с многопоточностью? И зачем она такая вообще нужна?

P.S. Программки очень простые, но если надо могу запостить.

> Так вот неужели в питоне все так плохо с многопоточностью? И зачем она такая вообще нужна?

Что бы можно было считать какой-нибудь сложный и одновременно показывать гуй. :) Насколько я понял, пистон позиционируется как язык для мелких утилиток. Как писал Гвидо ван Россум, если не нравится GIL, идите на ... .NET (IronPython) :) Вот такие вот дела.

anonymous
()

> Так вот неужели в питоне все так плохо с многопоточностью?

аха

> И зачем она такая вообще нужна?

ИМХО, для IO-параллелизма она вполне подходит.

Если нужно для вычислений, вот интересный модуль: www.parallelpython.com

tailgunner ★★★★★
()

Может в питоне буферизация дополнительная ввода/вывода есть, поэтому вывод кусками и идет. Попробуй для вывода строк в файл os.write и write(2) соответственно.

cobold ★★★★★
()
Ответ на: комментарий от cobold

> Может в питоне буферизация дополнительная ввода/вывода есть, поэтому вывод кусками и идет. Попробуй для вывода строк в файл os.write и write(2) соответственно.

Не зависит от. Буфер-то все равно общий на все треды, поэтому надписи и в нем должны перемешиваться.

Хотя если из двух потоков писать без пауз - то оно и на C будет довольно сильно "пачками".

anonymous
()

Therefore, the rule exists that only the thread that has acquired the global interpreter lock may operate on Python objects or call Python/C API functions. In order to support multi-threaded Python programs, the interpreter regularly releases and reacquires the lock -- by default, every 100 bytecode instructions (this can be changed with sys.setcheckinterval()). The lock is also released and reacquired around potentially blocking I/O operations like reading or writing a file, so that other threads can run while the thread that requests the I/O is waiting for the I/O operation to complete.

asgard
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.