2013-06-18 2 views
1

У меня вопрос о блокировке и потоке python, я понимаю, что блокировки используются для предотвращения перезаписи переменных другим потоком, нормально ли использовать блокировки, чтобы обойти эту проблему, поскольку это значит, что вы можете одновременно запускает только один поток, это также означает создание блокировок для захвата/выпуска для каждой переменной, которая может быть перезаписана, что для моего проекта запущено довольно много!python lock and threading concurrency

Как люди делают это ?, обертывание переменных в потокобезопасных списках или создание уникальных переменных, основанных на имени потока, возможно?, Или все засоряют свой код с помощью блокировки и выпусков ?.

+0

Странно, что это закрывается, как дубликат, так как вопрос касается не ссылается питона вообще. Да, есть много соображений, которые являются общими для большинства языков программирования, но некоторые языки гораздо более дружелюбны к нити, чем другие, и у каждого есть свои собственные причуды (например, PILON GIL, как сказал нам @nosklo). По этой причине важны ответы, посвященные python. – LarsH

+0

Ничто в заданном вопросе не является специфичным для python. Дальше вопрос широк и плохо поставлен, поэтому причина закрытия почти несущественна. –

ответ

2

Лучшая идея состоит в том, чтобы просто не использовать темы вообще. Большинство реализаций на Python имеют глобальную блокировку интерпретатора, которая устраняет преимущества использования потоков на первом месте. Если вы используете потоки для ожидания ввода-вывода, вы можете получить такую ​​же или лучшую производительность, если вместо этого вы используете вместо асинхронного ввода-вывода. Если вы используете потоки для выполнения вычислений (хруст числа) для разных процессоров, глобальная блокировка python не позволяет ему работать, поэтому лучше использовать несколько процессов.

В отличие от того, что у него нет восходящего потока, в потоке в python есть много недостатков и оговорок, как вы уже узнали. Вам все еще нужно управлять доступом к данным, а также иметь дело с странностями, связанными с потоками, получающими внимание процессора в моменты, когда вы не контролируете. Все это не принесет никакой пользы.

TL; DR просто не использовать темы

+0

ОК спасибо, поэтому, чтобы суммировать попытку и использовать многопроцессорную обработку вместо потоковой передачи, так как это оборачивает требование для GIL, да? – Paul

+0

@Paul, если вам нужно несколько хрустов ядра, тогда да. Если вам нужно ждать ввода/вывода, просто используйте асинхронный ввод-вывод в одном потоке/процессе. – nosklo

+0

Не правда, что нить не имеет никакого роста. Используйте потоки, когда у вас есть большое количество состояний для совместного использования между задачами. Используйте многопроцессорность там, где вы этого не сделаете, и накладные расходы для forking высоки (например, когда вам нужно разделить много состояний kb между процессами). Вот отличный видеоролик со стороны основного автора python https://www.youtube.com/watch?v=Bv25Dwe84g0 Вы * DO * нужно быть осторожным, чтобы избежать разветвления после создания потока. Я думаю, что хруст числа обычно происходит за пределами GIL (библиотеки C обычно должны выпускать GIL при обработке). – user48956

2

Пожалуйста, следуйте этим link Объясняет различные аспекты многопоточности вообще с примерами Python