асинхронное программирование в Python

Существует ли универсальное понятие асинхронного программирования в Python? Я мог присвоить обратный вызов функции, выполнить его и сразу возвратиться к основному процессу выполнения программы, неважно, сколько времени выполнение той функции взяло бы?

57
задан p.campbell 11 July 2010 в 00:11
поделиться

5 ответов

Взгляните сюда:

Асинхронное программирование в Python

Введение в асинхронное программирование и Twisted

Стоит проверить:

asyncio (ранее Tulip) был зарегистрирован в ветке Python по умолчанию

] Отредактировано 14 марта 2018 г.

Сегодня Python имеет asyncIO - встроенный асинхронный ввод-вывод, цикл событий, сопрограммы и задачи .

Описание взято из ссылки выше:

Модуль asyncIO предоставляет инфраструктуру для написания однопоточных параллельный код с использованием сопрограмм, мультиплексирование доступа ввода / вывода через сокеты и другие ресурсы, работающие с сетевыми клиентами и серверами, и другие родственные примитивы. Вот более подробный список пакета содержание:

  1. подключаемый цикл событий с различными реализациями для конкретной системы;
  2. абстракции транспорта и протокола (аналогичные тем, что в Twisted);
  3. конкретная поддержка TCP, UDP, SSL, каналов подпроцесса, отложенных вызовов, и другие (некоторые могут быть системно-зависимыми);
  4. класс Future, который имитирует класс в модуле concurrent.futures, но адаптирован для использования с циклом событий;
  5. сопрограммы и задачи, основанные на yield from (PEP 380 ), к помощь в последовательном написании параллельного кода;
  6. поддержка отмены для Futures и сопрограмм;
  7. примитивы синхронизации для использования между сопрограммами в одном потоке, имитируя те, что в модуль потоковой передачи;
  8. интерфейс для передачи работы пулу потоков, для тех случаев, когда вам абсолютно необходимо использовать библиотеку, которая выполняет блокирующие вызовы ввода-вывода.

Асинхронное программирование более сложное чем классическое «последовательное» программирование: см. Разработка с помощью asyncio страница , на которой перечислены распространенные ловушки и объясняется, как их избежать. Давать возможность режим отладки во время разработки для обнаружения общих проблем.

Также стоит посмотреть:

Руководство по асинхронному программированию на Python с asyncIO

38
ответ дан 24 November 2019 в 19:26
поделиться

Другие респонденты указывают вам на Twisted, который является отличным и очень полным фреймворком, но, на мой взгляд, он имеет очень непитонический дизайн. Кроме того, AFAICT, вы должны использовать главный цикл Twisted, что может стать для вас проблемой, если вы уже используете что-то другое, предоставляющее свой собственный цикл.

Вот надуманный пример, демонстрирующий использование модуля threading:

from threading import Thread

def background_stuff():
  while True:
    print "I am doing some stuff"

t = Thread(target=background_stuff)
t.start()

# Continue doing some other stuff now

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

Модуль threading предоставляет множество таких примитивов для использования, если вы знаете, как их применять.

14
ответ дан 24 November 2019 в 19:26
поделиться

То, что вы описали (основной поток программы немедленно возобновляется во время выполнения другой функции), не является тем, что обычно называют "асинхронным" (оно же "событийно-управляемое") программированием, а скорее "многозадачным" (оно же "многопоточное" или "многопроцессорное"). То, что вы описали, можно получить с помощью модулей стандартной библиотеки threading и multiprocessing (последний позволяет реальное одновременное выполнение на многоядерных машинах).

Асинхронное (управляемое событиями) программирование поддерживается в стандартной библиотеке Python модулями asyncore и asynchat, которые очень ориентированы на сетевые задачи (действительно, они внутренне используют модуль select, который в Windows поддерживает только сокеты - хотя в Unixy OS он также может поддерживать любой файловый дескриптор).

Для более общей (хотя также в основном ориентированной на работу с сетями, но не ограниченной этим) поддержки асинхронного (управляемого событиями) программирования, обратите внимание на twisted сторонний пакет.

59
ответ дан 24 November 2019 в 19:26
поделиться

Возможно, вы захотите проверить библиотеку Twisted для Python. Они предоставляют множество полезных инструментов.

  1. Небольшой учебник
  2. Отсрочка и подобные вещи
3
ответ дан 24 November 2019 в 19:26
поделиться

Вы можете увидеть мой инструмент асинхронного программирования Python: http://www.ideawu.com/blog/2010/08/delegate-in-pythonpython-asynchronous-programming.html

import time, random, sys
from delegate import *

def proc(a):
    time.sleep(random.random())
    return str(a)

def proc_callback(handle, args=None):
    ret = d.end(handle)

d = Delegate()
d.init(2) # number of workers

handle = d.begin(proc, '12345', proc_callback, 'test')
sys.stdin.readline()

d.free()
1
ответ дан 24 November 2019 в 19:26
поделиться
Другие вопросы по тегам:

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