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

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

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

4b9b3361

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 4

Другие респонденты указывают вам на 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

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

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

Ответ 6

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