Подтвердить что ты не робот

Как threading.Thread дает остальную часть своего кванта в Python?

У меня есть поток, который опросит часть оборудования.

while not hardware_is_ready():
    pass
process_data_from_hardware()

Но есть и другие потоки (и процессы!), которые могут иметь что-то делать. Если это так, я не хочу сжечь процессор, проверяя оборудование на каждую другую инструкцию. Прошло некоторое время с тех пор, как я занимался потоковой обработкой, и когда я это делал, это был не Python, но я считаю, что большинство потоковых библиотек имеют функцию yield или что-то, что позволяет потоку сообщать планировщику "Дайте другим потокам шанс".

while not hardware_is_ready():
    threading.yield()          # This function doesn't exist.
process_data_from_hardware()

Но я не могу найти ссылку на что-то подобное в документации по потокам. У Python есть оператор yield, но я уверен, что что-то еще (что делать с генераторами).

Какая правильная вещь здесь?

4b9b3361

Ответ 1

time.sleep(0) достаточно для обеспечения контроля - нет необходимости использовать положительный эпсилон. В самом деле, time.sleep(0) MEANS "дает возможность любому другому потоку быть готовым".

Ответ 2

Прочитайте глобальную блокировку интерпретатора (GIL).

Например: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/

Также: http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html

Сделайте это в своем коде, если вы должны сделать Занято ожидание (например, опрос устройства).

time.sleep( 0.0001 )

Это приведет к планировщику потоков.

Кроме того, я собрал несколько заметок и ссылок в http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.html

Ответ 3

Если вы делаете это на * nix, вы можете найти полезную библиотеку select. Kamaela также содержит несколько компонентов, которые могут вам пригодиться, но это может потребовать изменения парадигмы.