Programing

파이썬의 비동기 프로그래밍

lottogame 2020. 12. 15. 08:10
반응형

파이썬의 비동기 프로그래밍


파이썬에 비동기 프로그래밍에 대한 일반적인 개념이 있습니까? 함수에 콜백을 할당하고 실행 한 다음 해당 함수를 실행하는 데 걸리는 시간에 관계없이 즉시 기본 프로그램 흐름으로 돌아갈 수 있습니까?


여기를보세요 :

Python의 비동기 프로그래밍

비동기 프로그래밍 및 Twisted 소개

체크 아웃 할 가치가있는 :

asyncio (이전의 Tulip)가 Python 기본 브랜치에 체크인되었습니다.

2018 년 3 월 14 일에 편집 됨

오늘날 파이썬에는 비동기 I / O, 이벤트 루프, 코 루틴 및 태스크가 내장 된 asyncIO 가 있습니다.

위 링크에서 가져온 설명 :

asyncIO의 모듈을 작성하기위한 인프라를 제공 다중화, 코 루틴을 사용하여 동시 코드를 단일 스레드 I / O 액세스를 소켓과 네트워크 클라이언트와 서버, 및 기타 관련 프리미티브 실행중인 다른 자원. 패키지 내용물에 대한 자세한 목록은 다음과 같습니다.

  1. 다양한 시스템 특정 구현을 가진 플러그 형 이벤트 루프;
  2. 전송 및 프로토콜 추상화 (Twisted와 유사)
  3. TCP, UDP, SSL, 하위 프로세스 파이프, 지연된 호출 등에 대한 구체적인 지원 (일부는 시스템에 따라 다를 수 있음)
  4. concurrent.futures 모듈에서 모방하지만 이벤트 루프와 함께 사용하도록 조정 된 Future 클래스
  5. 순차 방식으로 동시 코드를 작성하는 데 도움이되는 (PEP 380)의 수율을 기반으로하는 코 루틴 및 작업;
  6. 선물 및 코 루틴에 대한 취소 지원;
  7. 단일 스레드의 코 루틴간에 사용하기위한 동기화 프리미티브, 스레딩 모듈의 항목을 모방합니다.
  8. I / O 호출을 차단하는 라이브러리를 절대적으로 사용해야하는 경우 작업을 스레드 풀로 전달하기위한 인터페이스입니다.

비동기 프로그래밍은 기존의 "순차적"프로그래밍보다 더 복잡 합니다. 일반적인 트랩을 나열하고이를 방지하는 방법을 설명하는 asyncio로 개발 페이지참조하십시오 . 개발 중에 디버그 모드를 활성화하여 일반적인 문제를 감지합니다.

또한 확인해 볼 가치가 있습니다 :

asyncIO를 사용한 Python의 비동기 프로그래밍 가이드


설명하는 내용 (다른 기능이 실행되는 동안 즉시 재개되는 주요 프로그램 흐름)은 일반적으로 "비동기"(일명 "이벤트 기반") 프로그래밍이 아니라 "멀티 태스킹"(일명 "멀티 스레딩"또는 "다중 처리")입니다. 당신은 당신이 표준 라이브러리 모듈 설명 것을 얻을 수 threadingmultiprocessing(후자는 멀티 코어 시스템에서 실제 동시 실행을 할 수 있습니다).

비동기 (이벤트 기반) 프로그래밍은 asyncoreasynchat모듈 의 표준 Python 라이브러리에서 지원되며 , 이는 네트워킹 작업에 매우 적합합니다 (실제로 내부적으로 select모듈을 사용합니다 . Windows에서는 소켓 만 지원합니다. 또한 모든 파일 설명자 지원).

비동기 (이벤트 기반) 프로그래밍에 대한보다 일반적인 (대부분 네트워킹 지향이지만 이에 국한 되지는 않음 ) 지원에 대해서는 트위스트 된 타사 패키지를 확인하십시오 .


모두 좋은 소식입니다!

Python 3.4에는 새로운 야심 찬 비동기 프로그래밍 구현 이 포함됩니다 !

그것은 현재 튤립 이라고 불리며 이미 활발한 팔로어가 있습니다.

에서 설명한 바와 같이 비동기 IO 지원 : PEP 3153PEP 3156 : 비동기 IO 지원 재부팅 :

지금 파이썬으로 비동기 코드를 작성하려는 사람들에게는 몇 가지 옵션이 있습니다.

  • asyncore 및 asynchat;
  • 선택 모듈을 기반으로하는 맞춤화 된 것;
  • Twisted 또는 gevent 와 같은 타사 라이브러리를 사용합니다 .

안타깝게도 이러한 각 옵션에는 단점이 있으며이 PEP가 해결하려고합니다.

오랫동안 Python 표준 라이브러리의 일부 였음에도 불구하고 asyncore 모듈은 현대 비동기 네트워킹 모듈의 기대에 부응하지 않는 유연하지 않은 API로 인해 근본적인 결함이 있습니다.

더욱이 그 접근 방식은 개발자에게 비동기 네트워킹의 잠재력을 완전히 활용하는 데 필요한 모든 도구를 제공하기에는 너무 단순합니다.

현재 프로덕션에서 가장 많이 사용되는 솔루션은 타사 라이브러리를 사용하는 것입니다. 이들은 종종 만족스러운 솔루션을 제공하지만 이러한 라이브러리간에 호환성이 부족하여 코드베이스가 사용하는 라이브러리와 매우 밀접하게 결합되는 경향이 있습니다.

현재 서로 다른 비동기 IO 라이브러리 간의 이식성이 부족하여 타사 라이브러리 개발자에게 많은 노력이 중복됩니다. 충분히 강력한 추상화는 비동기 코드가 한 번만 작성되지만 모든 곳에서 사용된다는 것을 의미 할 수 있습니다.

다음은 그 능력에 대한 간략한 개요 입니다.


다른 응답자들은 위대하고 매우 포괄적 인 프레임 워크 인 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사용하는 당신이 그들을 사용하는 방법을 알고있는 경우 모듈은 많은 그런 프리미티브를 제공합니다.


You may well want to checkout the Twisted library for Python. They provide many useful tools.

  1. A little primer
  2. Defer and Related stuff

You may see my Python Asynchronous Programming tool: 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()

ReferenceURL : https://stackoverflow.com/questions/3221314/asynchronous-programming-in-python

반응형