Есть что-то похожее на Java Thread.yield () в Python? Это вообще имеет смысл? - PullRequest
8 голосов
/ 15 декабря 2009

Я хочу сказать, чтобы мои потоки Python уступали, и поэтому избегайте ненужной загрузки процессора. В Java вы можете сделать это, используя функцию Thread.yield(). Я не думаю, что есть что-то подобное в Python, поэтому я использовал time.sleep(t), где t = 0.00001. Для t=0, похоже, нет эффекта.

Я думаю, что, возможно, есть что-то, что я не правильно понимаю в модели потоков Python, и, следовательно, причина отсутствия thread.yield(). Может кто-нибудь объяснить это мне? Спасибо!

PS: Это то, что говорится в документации для Java Thread.yield():

Вызывает текущий выполняющийся поток объект временно приостановить и разрешить другие потоки для выполнения.

Ответы [ 3 ]

10 голосов
/ 15 декабря 2009
4 голосов
/ 15 декабря 2009

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

Однако, при нормальных обстоятельствах, только один поток Python выполняется одновременно. (Исключения, как правило, возникают во времена, когда потоки ожидают ввода от внешних устройств, таких как жесткий диск или сеть.) Это связано с Global Interpreter Lock . Это, однако, означает, что вы, вероятно, не получаете столько пользы от потоков в Python, как в Java или во многих других языках. Обойти эту проблему не обязательно тривиально, хотя переход на многопроцессорность вместо многопоточности - один хороший подход, если это возможно.

Однако то, что вы хотите сделать, кажется в некотором смысле некорректным - если у вас есть 2 потока, и у них обоих есть работа, вам не нужно писать код на стороне приложения для переключения между ними. Это работа операционной системы или виртуальной машины. Если вы обнаружите, что один поток говорит «делать меньше», потому что вы хотите отдать предпочтение другому потоку с точки зрения процессорного времени, то вместо того, чтобы добавлять произвольную уступку или спящий режим, вам, вероятно, следует вместо этого установить приоритеты потока. (Хотя, опять же, это может не иметь большого значения в Python, учитывая наличие глобальной блокировки интерпретатора.)

0 голосов
/ 09 июля 2016

Thread.yield () отсутствует в python, потому что, возможно, он был забыт или разработчик решил, что все проблемы синхронизации и межпроцессного взаимодействия можно решить без Thread.yield ().

Я бы использовал Thread.yield () для следующей проблемы:

например. имеется очередь заданий, и есть 2 рабочих потока, которые могут извлекать записи из очереди заданий и помещать записи в очередь заданий. Один из способов решить эту проблему - использовать класс threading.Condition. Когда рабочий 'B' хочет получить запись в очереди, но очередь пуста, он переходит в состояние ожидания (Condition.wait ()). Когда работник 'A' помещает запись в очередь, он пробуждает работника 'B' (Condition.notify ()). В этот момент уступка важна, потому что, если рабочий «А» здесь не уступает, рабочий «А» может получить задание до того, как рабочий «В» проснется, что вызывает проблему состояния гонки.

Интересно, как это разрешимо без Thread.yield ().

...