Там что-то подобное Thread.yield Java () в Python? Это даже имеет смысл?

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

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

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

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

8
задан Carlos 15 December 2009 в 18:03
поделиться

2 ответа

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

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

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

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

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

4
ответ дан 5 December 2019 в 12:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: