Асинхронное программирование в Python - PullRequest
57 голосов
/ 11 июля 2010

Существует ли общее понятие асинхронного программирования в python? Могу ли я назначить функцию обратного вызова, выполнить ее и немедленно вернуться к основному потоку программы, независимо от того, сколько времени займет выполнение этой функции?

Ответы [ 6 ]

59 голосов
/ 11 июля 2010

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

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

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

37 голосов
/ 11 июля 2010

Посмотрите здесь:

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

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

Стоитпроверка:

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

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

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

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

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

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

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

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

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

19 голосов
/ 07 августа 2013

Хорошие новости всем!

В Python 3.4 будет включено новое амбициозное асинхронное программирование реализация !

В настоящее время он называется tulip и уже имеет активную подписку .

Как описано в PEP 3153: поддержка асинхронного ввода-вывода и PEP 3156: поддержка асинхронного ввода-вывода перезагружена :

Люди, которые хотят сейчас написать асинхронный код на Python, имеют несколько вариантов:

  • asyncore и asynchat;
  • что-то сделанное на заказ, скорее всего, на основе модуля select;
  • с использованием сторонней библиотеки, такой как Twisted или gevent .

К сожалению, у каждого из этих вариантов есть свои недостатки, которые пытается решить этот PEP.

Несмотря на то, что модуль asyncore долгое время был частью стандартной библиотеки Python, он страдает фундаментальными недостатками, вытекающими из негибкого API, который не соответствует ожиданиям современного модуля асинхронной сети.

Более того, его подход слишком упрощен, чтобы предоставить разработчикам все инструменты, которые им необходимы, чтобы полностью использовать потенциал асинхронных сетей.

Наиболее популярное решение, которое сейчас используется в производстве, включает использование сторонних библиотек. Они часто обеспечивают удовлетворительные решения, но между этими библиотеками отсутствует совместимость, что приводит к тому, что кодовые базы очень тесно связаны с используемой библиотекой.

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

Вот краткий обзор 1048 * его способностей.

14 голосов
/ 11 июля 2010

Другие респонденты указывают вам на 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 предоставляет вам множество таких примитивов, если вы знаете, как их использовать.

3 голосов
/ 11 июля 2010

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

  1. Небольшой учебник для начинающих
  2. Отложенные и сопутствующие вещи
1 голос
/ 28 августа 2010

Вы можете увидеть мой инструмент асинхронного программирования 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()
...