Я хотел бы представить некоторую функцию, такую как setTimeout или setInterval JavaScript, переносящую какое-то асинхронное поведение без большого количества блокировок. вызывает запуск цикла обработки событий.
Давайте посмотрим на этот пример (теперь, конечно, он не работает):
Код: Выделить всё
from mymod import set_timeout # of course we love the PEP8 :)
import sys, time
def say_finished():
time.sleep(2) # waiting, suppose here to have some blocking behaviour
sys.stdout.write("\nSee you!")
sys.stdout.write("Hello, ")
set_timeout(say_finished, 2000) # supposing we have msec granularity
sys.stdout.write("World!")
Буду ли я так делать? можно ли обойти это поведение, если set_timeout будет использовать потоки Posix в коде C?
Это будет интеграция с Python C/API, а я не могу знаю, если я может обойти GIL, или сам API также принудительно блокируется GIL (я бы попробовал, но сейчас изучаю документацию и не готов пробовать это сам).
Тогда должно быть так: напечатайте «Hello» -> запустите set_timeout (который должен вернуться, чтобы позволить интерпретатору продолжить выполнение программы) -> напечатайте «World!» -> оставаться в живых, пока работает внешний поток -> обратный вызов "say_finished" -> конец.
Что заставляет меня думать, что потребуется отредактировать сам интерпретатор, так это часть, говорящая "оставаться в живых" пока работает внешний поток".
Я не хочу использовать процессы из-за накладных расходов, которые создает новый процесс.
Пожалуйста, не делайте этого. Я не говорю «тогда используйте JavaScript», потому что мне нравится синтаксис Python, и я хотел бы использовать этот подход с это.
Подробнее здесь: https://stackoverflow.com/questions/935 ... a-c-module
Мобильная версия