찾다
백엔드 개발파이썬 튜토리얼Python이 future를 통해 동시성 문제를 처리하는 방법에 대한 자세한 예

이 기사에서는 미래를 통해 동시성 문제를 처리하기 위해 Python을 주로 소개합니다. 매우 훌륭하고 참조 가치가 있습니다. 필요한 친구는 참조할 수 있습니다.

미래에 대한 첫 소개

다음 스크립트를 사용하세요. 미래에 대한 예비 이해 :

예제 1: 일반 루프 방법

import os
import time
import sys
import requests
POP20_CC = (
 "CN IN US ID BR PK NG BD RU JP MX PH VN ET EG DE IR TR CD FR"
).split()
BASE_URL = 'http://flupy.org/data/flags'
DEST_DIR = 'downloads/'
def save_flag(img,filename):
 path = os.path.join(DEST_DIR,filename)
 with open(path,'wb') as fp:
 fp.write(img)
def get_flag(cc):
 url = "{}/{cc}/{cc}.gif".format(BASE_URL,cc=cc.lower())
 resp = requests.get(url)
 return resp.content
def show(text):
 print(text,end=" ")
 sys.stdout.flush()
def download_many(cc_list):
 for cc in sorted(cc_list):
 image = get_flag(cc)
 show(cc)
 save_flag(image,cc.lower()+".gif")
 return len(cc_list)
def main(download_many):
 t0 = time.time()
 count = download_many(POP20_CC)
 elapsed = time.time()-t0
 msg = "\n{} flags downloaded in {:.2f}s"
 print(msg.format(count,elapsed))
if __name__ == '__main__':
 main(download_many)

예 2: 미래 방법을 통해 구현, 여기서는 위 코드의 일부를 재사용합니다

 from concurrent import futures
from flags import save_flag, get_flag, show, main
MAX_WORKERS = 20
def download_one(cc):
 image = get_flag(cc)
 show(cc)
 save_flag(image, cc.lower()+".gif")
 return cc
def download_many(cc_list):
 workers = min(MAX_WORKERS,len(cc_list))
 with futures.ThreadPoolExecutor(workers) as executor:
 res = executor.map(download_one, sorted(cc_list))
 return len(list(res))
if __name__ == '__main__':
 main(download_many)

각각 세 번 실행합니다. 두 방법의 평균 속도 : 13.67과 1.59초에서는 여전히 그 차이가 매우 크다는 것을 알 수 있습니다.

future

future는 Concurrent.futures 모듈과 asyncio 모듈의 중요한 구성 요소입니다.

python3.4부터 표준 라이브러리에는 Future라는 두 개의 클래스가 있습니다: Concurrent.futures.Future 및 asyncio.Future
이 두 클래스는 동일한 목적을 수행합니다. 두 Future 클래스의 인스턴스는 완료되거나 완료되지 않을 수 있는 지연된 계산을 나타냅니다. Twisted의 Deferred 클래스 및 Tornado 프레임워크의 Future 클래스와 유사합니다

참고: 일반적으로 future를 직접 생성해서는 안 되며 동시 프레임워크(concurrent.futures 또는 asyncio)에 의해 인스턴스화됩니다

이유: future는 끝을 나타냅니다. 어떤 일이 일어날지 결정하는 유일한 방법은 실행 시간이 예약되어 있으므로 Concurrent.futures.Future 인스턴스는 무언가가 Concurrent.futures.Executor 하위 클래스로 넘겨질 때만 생성됩니다.
예: Executor.submit() 메소드의 매개변수는 호출 가능 객체입니다. 이 메소드를 호출하면 수신 호출 가능 객체에 대한 시간이 예약되며

future

클라이언트 코드는 미래 상태를 변경할 수 없습니다. 동시성 프레임워크는 미래로 표현되는 지연된 계산이 끝난 후 미래 개체의 상태를 변경하며 계산이 끝나는 시점을 제어할 수 없습니다.

두 future에는 .done() 메서드가 있습니다. 이 메서드는 차단되지 않으며 반환 값은 future에 연결된 호출 가능 객체가 실행되었는지 여부를 나타내는 부울 값입니다. 클라이언트 코드는 일반적으로 future 실행이 완료되었는지 묻지 않지만 알림을 기다립니다. 따라서 두 Future 클래스에는 모두 .add_done_callback() 메서드가 있습니다. 이 메서드에는 매개 변수가 하나만 있으며 유형은 호출 가능 객체입니다. 지정된 호출 가능 객체는 future가 실행된 후에 호출됩니다.

.result() 메서드는 두 개의 Future 클래스에서 동일한 기능을 갖습니다. 즉, 호출 가능 객체의 결과를 반환하거나 호출 가능 객체를 실행할 때 발생한 예외를 다시 발생시킵니다. 그러나 future 실행이 종료되지 않으면 두 Future 클래스의 결과 메서드 동작이 매우 다릅니다.

concurrent.futures.Future 인스턴스의 경우 .result() 메서드를 호출하면 반환할 결과가 있을 때까지 호출자의 스레드가 차단됩니다. 이때 결과 메서드는 지정된 경우 선택적 시간 초과 매개변수를 받을 수 있습니다. future가 시간 내에 실행을 마치지 않으면 TimeoutError 예외가 발생합니다.

asyncio.Future.result 메서드는 시간 제한 설정을 지원하지 않습니다. 향후 결과를 얻으려면 구조의 수율을 사용하는 것이 가장 좋지만 Concurrent.futures.Future는 이를 수행할 수 없습니다.

asyncio 또는 Concurrent.futures인지 여부. .Future, 여러 함수는 future를 반환하고 다른 함수는 future를 사용합니다. 첫 번째 예에서 우리가 사용하는 Executor.map은 future를 사용합니다. 반환 값은 반복자의 __next__ 메서드가 각 future의 결과를 호출합니다. 따라서 우리가 얻는 것은 미래 자체가 아니라 각 미래의 결과입니다

future.as_completed 함수 사용과 관련하여 여기서는 두 개의 루프를 사용합니다. 하나는 미래를 생성하고 예약하는 데 사용되고 다른 하나는 사용됩니다. 결과

from concurrent import futures
from flags import save_flag, get_flag, show, main
MAX_WORKERS = 20
def download_one(cc):
 image = get_flag(cc)
 show(cc)
 save_flag(image, cc.lower()+".gif")
 return cc
def download_many(cc_list):
 cc_list = cc_list[:5]
 with futures.ThreadPoolExecutor(max_workers=3) as executor:
 to_do = []
 for cc in sorted(cc_list):
  future = executor.submit(download_one,cc)
  to_do.append(future)
  msg = "Secheduled for {}:{}"
  print(msg.format(cc,future))
 results = []
 for future in futures.as_completed(to_do):
  res = future.result()
  msg = "{}result:{!r}"
  print(msg.format(future,res))
  results.append(res)
 return len(results)
if __name__ == '__main__':
 main(download_many)

결과는 다음과 같습니다.

참고: Python 코드는 IO 작업을 차단하는 표준 라이브러리의 모든 함수가 운영 체제를 기다리는 동안 GIL을 해제합니다. 결과를 반환하기 위해 다른 스레드를 실행하고, 이것이 바로 Python 스레드가 IO 집약적인 응용 프로그램에서 역할을 할 수 있는 이유입니다

위는 스레드를 시작하는 동시.futures이고, 다음은 프로세스를 시작하는 것입니다. 그것을 통해

concurrent.futures를 사용하여 프로세스를 시작

concurrent.futures ProcessPoolExecutor 클래스는 작업을 여러 Python 프로세스에 분산하므로 CPU 집약적인 처리가 필요한 경우 이 모듈을 사용하여 GIL을 우회하고 활용하십시오. 모든 CPU 코어.

원칙은 ProcessPoolExecutor가 N개의 독립적인 Python 인터프리터를 생성한다는 것입니다. 여기서 N은 시스템에서 사용 가능한 CPU 코어 수입니다.

사용 방법은 ThreadPoolExecutor 방법과 동일합니다

위 내용은 Python이 future를 통해 동시성 문제를 처리하는 방법에 대한 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
파이썬 : 게임, Guis 등파이썬 : 게임, Guis 등Apr 13, 2025 am 12:14 AM

Python은 게임 및 GUI 개발에서 탁월합니다. 1) 게임 개발은 Pygame을 사용하여 드로잉, 오디오 및 기타 기능을 제공하며 2D 게임을 만드는 데 적합합니다. 2) GUI 개발은 Tkinter 또는 PYQT를 선택할 수 있습니다. Tkinter는 간단하고 사용하기 쉽고 PYQT는 풍부한 기능을 가지고 있으며 전문 개발에 적합합니다.

Python vs. C : 응용 및 사용 사례가 비교되었습니다Python vs. C : 응용 및 사용 사례가 비교되었습니다Apr 12, 2025 am 12:01 AM

Python은 데이터 과학, 웹 개발 및 자동화 작업에 적합한 반면 C는 시스템 프로그래밍, 게임 개발 및 임베디드 시스템에 적합합니다. Python은 단순성과 강력한 생태계로 유명하며 C는 고성능 및 기본 제어 기능으로 유명합니다.

2 시간의 파이썬 계획 : 현실적인 접근2 시간의 파이썬 계획 : 현실적인 접근Apr 11, 2025 am 12:04 AM

2 시간 이내에 Python의 기본 프로그래밍 개념과 기술을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우기, 2. 마스터 제어 흐름 (조건부 명세서 및 루프), 3. 기능의 정의 및 사용을 이해하십시오. 4. 간단한 예제 및 코드 스 니펫을 통해 Python 프로그래밍을 신속하게 시작하십시오.

파이썬 : 기본 응용 프로그램 탐색파이썬 : 기본 응용 프로그램 탐색Apr 10, 2025 am 09:41 AM

Python은 웹 개발, 데이터 과학, 기계 학습, 자동화 및 스크립팅 분야에서 널리 사용됩니다. 1) 웹 개발에서 Django 및 Flask 프레임 워크는 개발 프로세스를 단순화합니다. 2) 데이터 과학 및 기계 학습 분야에서 Numpy, Pandas, Scikit-Learn 및 Tensorflow 라이브러리는 강력한 지원을 제공합니다. 3) 자동화 및 스크립팅 측면에서 Python은 자동화 된 테스트 및 시스템 관리와 ​​같은 작업에 적합합니다.

2 시간 안에 얼마나 많은 파이썬을 배울 수 있습니까?2 시간 안에 얼마나 많은 파이썬을 배울 수 있습니까?Apr 09, 2025 pm 04:33 PM

2 시간 이내에 파이썬의 기본 사항을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우십시오. 이를 통해 간단한 파이썬 프로그램 작성을 시작하는 데 도움이됩니다.

10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법?10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법?Apr 02, 2025 am 07:18 AM

10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까?중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까?Apr 02, 2025 am 07:15 AM

Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

Python 3.6에 피클 파일을로드 할 때 '__builtin__'모듈을 찾을 수없는 경우 어떻게해야합니까?Python 3.6에 피클 파일을로드 할 때 '__builtin__'모듈을 찾을 수없는 경우 어떻게해야합니까?Apr 02, 2025 am 07:12 AM

Python 3.6에 피클 파일로드 3.6 환경 보고서 오류 : modulenotfounderror : nomodulename ...

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기