LINUX.ORG.RU

Перевод статьи «Основы работы с потоками в Python»


0

0

Перевод статьи Basic Threading in Python (автор Peyton McCullough).

Если вы желаете, чтобы ваше приложение выполняло несколько задач в одно и то же время, то можете воспользоваться потоками (threads). Python может работать с потоками, но много разработчиков находят программирование потоков очень сложным.

>>> читать статью

anonymous

Проверено: anonymous_incognito ()

Считается, что любую задачу можно переписать без использования потоков. Например, веб-сервер можно реализовать, используя очереди состояний клиентов, неблокирующие IO-вызовы и select.

"Threads are for those, who cannot program state machines. Computer is a state machine." (c) не_помню_кто

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

> "Threads are for those, who cannot program state machines. Computer is a state machine." (c) не_помню_кто

Хм, ты за столько лет не понял, что это шутка, или уже сам шутишь? 8)

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

>"Threads are for those, who cannot program state machines. Computer is a state machine." (c) не_помню_кто

Выгодно, если в наличии 1 процессор/1 ядро, то да, но если это кородуо с n ядрами?

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

есть такая вещь, как целесообразность. имхо производительность веб сервера в такой реализации упадет ниже плинтуса...

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

> Выгодно, если в наличии 1 процессор/1 ядро

В наличии всегда больше одного процессора: сеть, диск и ЦП могут работать в параллель, вот тебе 3 процессора 8)

tailgunner ★★★★★
()

Треды в питоне - вещ хорошая (и совсем не сложная), пока у тебя 1 процессор... А вот GIL всю картину портит.

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

>Выгодно, если в наличии 1 процессор/1 ядро, то да, но если это кородуо с n ядрами?

Из-за GIL программа на питоне живёт только на одном процессоре. Потоки реально используются для разруливания блокируемых системных вызовов и такого прочего.

Если хочется распараллелиться, надо использовать модуль processing. Это реализация параллельных процессов с интерфейсом как у threading

adarovsky ★★★★
()

а в stackless все ещё интереснее. там переключение между тредами руками делается. Говорят так удобнее. Я к сожалению знаю лишь теорию не разбирался сам пока

makkintosh
()

> А вот GIL всю картину портит.

Увы, да. Но зато можно в учебных целях использовать :)

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

>Как Python хорошо читается! Это не Java какая-нибудь.

Программировал я в перле, не так, что бы много, но есть. И попросили меня на питоне скрипт написать.

Долго плевался. Ну все тоже самое, что в перле, только заставляют форматировать код. Задолбаешся текста выравнивать. А если кто поредактирует и табы на пробелы заменит, то вообше непонятно, что происходит. Строка съехала влево, в право и крандец.

Короче, обычные проблемы динамического языка + проблема с форматированием. Совершенно нечитаемый код.

Я не пойму, почему его пихают везде и всюду.

the_moon
()
Ответ на: комментарий от adarovsky

>Если хочется распараллелиться, надо использовать модуль processing. Это реализация параллельных процессов с интерфейсом как у threading

Спасибо, поковыряем. ;)

xkitenz
()
Ответ на: комментарий от adarovsky

> Если хочется распараллелиться, надо использовать модуль processing.

То лучше fork. Конечно, от задачи зависит, но, но...

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

>Считается, что любую задачу можно переписать без использования потоков. Например, веб-сервер можно реализовать, используя очереди состояний клиентов, неблокирующие IO-вызовы и select.

Это зачастую много сложне чем с потоками в смысле производительности.

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

>В наличии всегда больше одного процессора: сеть, диск и ЦП могут работать в параллель, вот тебе 3 процессора

Вообще-то select это и решает. Се что ниже селекта - работает параллельно. Селект отделяет параллельно работающие вещи от одного процессора.

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

> есть такая вещь, как целесообразность. имхо производительность веб сервера в такой реализации упадет ниже плинтуса...

Это как раз неправда. Самые быстрые вебсерверы (lighttpd, nginx) как раз так написаны.

Тред - довольно дорогая штуковина; и при том, что каналы на сервере толстые, а у клиентов - тонкие, держать по треду на соединение невыгодно.

Питоновские же треды плохи тем, что там GIL и пользы от них - чуть.

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

>Это как раз неправда. Самые быстрые вебсерверы (lighttpd, nginx) как раз так написаны.

Это не супер легко сделать. Подводных камней там - море. Неакуратно наступил - и начинает все тормозить. Короче бестредовые высокопроизводительыне приложения писать надо уметь. А с тредами любой дурак разберется.

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

> Задолбаешся текста выравнивать. А если кто поредактирует и табы на пробелы заменит, то вообше непонятно, что происходит.

Когда-то меня и групу младших негров вешали за яйца, если находили табы для выравнивания или форматирование хоть на проблем не по-стандарту. И правильно делали. Хотя, казалось бы, C#/C++ - не питон.

Выводы: питон хорош уж тем, что заставляет приучать к порядку в форматировании, ну а перлу, как мы видим, лучше все-таки умереть :)

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

>> Как Python хорошо читается! Это не Java какая-нибудь.

> этот апи 1 в 1 совпадает с жабским.

Загадка Жабы - апи вроде совпадает, а код читать невозможно.

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

> Задолбаешся текста выравнивать.

Сходи к хирургу - так, мол, и так, руки из жопы растут, помогите, доктор.

> А если кто поредактирует и табы на пробелы заменит,

Рекомендую хранить код в железном ящике, подальше от детей. А то как понабегут, табы на пробелы позаменяют! Многие люди только этим всю жизнь и заняты - меняют табы на пробелы.

А лучше, конечно, не дурить, и писать через четыре пробела, как нормальные люди.

> Совершенно нечитаемый код.

Когда к хирургу пойдёшь, заодно и к окулисту загляни.

> Я не пойму, почему его пихают везде и всюду.

Потому что когда с руками и глазами нормально - то Python является наиболее удобным языком разработки для приложений среднего объёма.

yk4ever
()
Ответ на: комментарий от sv75

>Загадка Жабы - апи вроде совпадает, а код читать невозможно.

ДА ладно - добавь пару скобок туда и будет то же самое.

r ★★★★★
()

Треды -- вещь полезная, вещь хорошая. Особенно легковесные треды. Эти вообще незаменимы.

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

> Питоновские же треды плохи тем, что там GIL и пользы от них - чуть.

Треды в питоне - они не для ускорения, а для выведения подзадач в фон. Строго говоря, если скорость критична - питон может использоваться только для прототайпинга.

yk4ever
()
Ответ на: комментарий от r

> ДА ладно - добавь пару скобок туда и будет то же самое.

А имена типов? а модификаторы доступа? А один класс в одном файле? а ArrayList и иже с ними? А try catch/throws обязательные?

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

> Так как лучше писать многопоточные приложения на python? Таки os.fork?

Если под позикс - то да. А вообще стоит решить - а точно ли это приложение нужно писать на питоне?

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

>>В наличии всегда больше одного процессора: сеть, диск и ЦП могут работать в параллель, вот тебе 3 процессора

> Вообще-то select это и решает.

Дисковый В/В для select не очень подходит.

> Селект отделяет параллельно работающие вещи от одного процессора.

я в курсе :D

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

> Если под позикс - то да.

А если нет?

> А вообще стоит решить - а точно ли это приложение нужно писать на питоне?

А какие альтернативы? С?

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

> Если под позикс - то да.

А если нет?

os.fork под виндой не пашет.

> А вообще стоит решить - а точно ли это приложение нужно писать на питоне?

> А какие альтернативы? С?

Альтернатив куча. От erlang до Boo, включая С. Знать бы, что *нужно*.

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

> Так как лучше писать многопоточные приложения на python? Таки os.fork?

Это уже многозадачное приложение.

Одну ссылку уже давали, вот еще одна: http://www.parallelpython.com

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

>А имена типов?

Java: Thread. Python: Thread. Задумался.....

>а модификаторы доступа?

Чего еще в питоне нет? :)

__init__ - верх эстетики.

>А один класс в одном файле?

Не читайте пролетарских газет. Там пишут неправду.

>а ArrayList и иже с ними?

А что с ним не так?

>А try catch/throws обязательные?

И вообще она статически типизирована. Каззлы - испоганили язык статической типизацией. Ведь это так приятно когда в рантайме что-то падает с ненайденными методами и несоотвествующими типами.

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

>> Дисковый В/В для select не очень подходит.

> Почему?

Так уж сделан Unix - нельзя ждать завершения В/В дискового файла через select. ЕМНИП, вооще нельзя ждать завершения В/В без AIO.

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

>Так уж сделан Unix - нельзя ждать завершения В/В дискового файла через select.

В каком смысле "нельзя"?

r ★★★★★
()

ИМХО переводить "Thread" как "Поток" -- примерно то же, что переводить "Directory" "Папкой"...

Ок, уже устоялось среди дИбилов, но -- дИбилизм же!

Die-Hard ★★★★★
()
Ответ на: комментарий от r

> Java: Thread. Python: Thread. Задумался..... Thread thread = ...

и

thread =

Разница есть?

> __init__ - верх эстетики.

Согласен. __init__ лучше избегать. С другой стороны, логика и единообразие есть.

> >а ArrayList и иже с ними?

> А что с ним не так?

То что он не First-class type?

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

>Разница есть?

Манифестационная типизация.

>То что он не First-class type?

Тоже упущение - согласен.

Но к у помянутому коду не имеет онтошения.

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

>В каком смысле "нельзя"?

Ага - понял.

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

> O_O каким образом?

Ну в принципе он совершенно не обязателен :)

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

> Манифестационная типизация.

А по выражению после "=" догадаться оно не может?

> Но к у помянутому коду не имеет онтошения.

Ну напиши аналог на яве, если не лень. (я бы са, мне лень). Может я и не прав.

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

> Считается, что любую задачу можно переписать без использования потоков. Например, веб-сервер можно реализовать, используя очереди состояний клиентов, неблокирующие IO-вызовы и select.

Считается, что любую задачу можно написать на любом Тьюринг-полном языке.

Но на Brainfuck я веб-сервер писать дешевле чем за 200$/час не возьмусь.

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

> на Brainfuck я веб-сервер писать дешевле чем за 200$/час не возьмусь.

Ну, это зависит от сроков 8)

tailgunner ★★★★★
()

> но много разработчиков находят программирование потоков очень сложным.

Бугага, и это продвинутые разработчики на python? Пусть возвращаются на php. 8)

atrus ★★★★★
()

о да, патоки это слишком сложно, интересно где эти 'много' программистов живут?

sni4ok
()
Ответ на: комментарий от sv75

>А по выражению после "=" догадаться оно не может?

Ну есть такой класс языков - с manifest staic typing. Да не OCaml. Ну так питон тоже не OCaml и рантайм TypeError на 

x = "a" 
print x + 1

меня тоже в восторг не приводит.

Python:

import threading

 theVar = 1

 class MyThread(threading.Thread):

     def run ( self ):
         global theVar
         print 'This is thread ' + str(theVar) + ' speaking.'
         print 'Hello and good bye.'
         theVar = theVar + 1

 for x in xrange ( 20 ):
     MyThread().start()

Java:

public class MyThread extends Thread {
    static int theVar = 1;

    public void run() {
        System.out.println("This is thread " + theVar + " speaking.");
        System.out.println("Hello and good bye.");
        theVar = theVar + 1;
    }

    public static void main(String[] args) {
        for (int x = 0; x < 20; x++) new MyThread().start();
    }
}

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