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



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

583   6  

6 ответов:

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

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

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

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

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

отредактировано 14-Mar-2018

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

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

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

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

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

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

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

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

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

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

хорошие новости для всех!

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

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

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

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

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

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

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

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

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

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

здесь краткая обзор его способностей.

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

вот надуманный пример, который продемонстрирует использование 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

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

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

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

  1. немного праймера
  2. отложить и связанные с этим вещи

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

Comments

    Ничего не найдено.