⚡ ️이글이글 구렁이🐍 동시 스크립트⚡️️
이것🐍 Python language is a 🐌 slow language - compared to C or FORTRAN 이 문제를 해결하기 위해 사람들은 프로그래밍 언어의 속도를 높이는 데 도움을 주는 여러 가지 방법을 개발했다.
한 가지 방법은
CONCURRENCY
이다.병발성🤷♂️
병발이란 두 임무가 겹치는 시간 내에 시작하고 운행하며 완성할 수 있다는 것을 말한다.이것은 반드시 그것들이 동시에 운행한다는 것을 의미하는 것은 아니다. (즉
Parallelism
여전히 곤혹스럽다😕? 다음 시나리오를 살펴보겠습니다.우리는 한 쌍의 특수한 부부를 위해 환상적인 결혼식을 계획하고 있다.우리는 마리, 수잔, 맥스, 시몬이 있다.꿈꾸는 결혼식에는 케이크, 밴드, 장식품과 청첩장이 필요하다.우리는 케이크의 베이킹 작업을 수잔에게 맡기고, 시몬에게 밴드를 고용하여, 마리에게 장식품을 배치하고, 청첩장을 맥스에게 부쳤다.
이 네 명의 친구(또는 처리자)는 모두 같은 시간에 임무(또는 절차)를 수행하고 임무가 완성될 때까지 전환하거나 중단하지 않는다.이것은 - 문외한의 용어에서 병발이라고 부른다.
PYTHON의 동시 유형🐍
Python에서 병렬되는 기본 유형은 다음과 같습니다. -
다중 스레드(917)🧵
A
Thread
는 운영 체제에서 가장 작은 실행 단위입니다.루틴은 프로그램이 자신을 두 개 혹은 여러 개로 나누어 동시에 실행하는 작업의 한 방식이다.루틴 자체는 프로그램이 아닙니다. 특정 프로그램이나 process
에서만 실행됩니다.다중 스레드가 게임 규칙을 바꾸었는데, 주로 I/O bound operations에 사용된다.운영 체제에서 지원되는 central processing unit (CPU)(또는 멀티 코어 프로세서의 싱글 코어) 기능을 통해 여러 스레드를 동시에 실행할 수 있습니다.모든 루트는 프로세스가 제공하는 같은 자원을 공유합니다.
다선정 조작의 예를 들자.먼저 동기화 프로세스를 살펴보겠습니다.
동기화 프로세스
# A simple python script that gets query a list of site
import requests
import time
def get_single_site(url):
with requests.get(url) as response:
print(f"Read {len(response.content)} from {url}")
def get_all_sites(sites):
for url in sites:
get_single_site(url, session)
if __name__ == "__main__":
start_time = time.time()
urls = [
"https://www.google.com",
"https://www.facebook.com",
"https://www.twitter.com/theghostyced"
] * 30
get_all_sites(urls)
end_time = time.time() - start_time
print(f"Downloaded {len(sites)} in {end_time} seconds")
이것은 제공된 사이트의 내용을 다운로드할 수 있는 간단한python 프로그램이다.사이트 내용을 다운로드하면 방문한 사이트의 수량과 시간을 출력한다.이 스크립트는
requests
라이브러리와 내장된python 표준 시간 라이브러리를 사용합니다.실행 코드의 출력은 다음과 같습니다.
...
Read 107786 from https://www.facebook.com
Read 608312 from https://www.twitter.com/theghostyced
Read 11369 from https://www.google.com
Read 107786 from https://www.facebook.com
Read 608077 from https://www.twitter.com/theghostyced
Read 11369 from https://www.google.com
Read 107787 from https://www.facebook.com
Read 608077 from https://www.twitter.com/theghostyced
Read 11369 from https://www.google.com
Read 107351 from https://www.facebook.com
Read 608311 from https://www.twitter.com/theghostyced
Read 11369 from https://www.google.com
Read 107507 from https://www.facebook.com
Read 608312 from https://www.twitter.com/theghostyced
Read 11369 from https://www.google.com
Read 107918 from https://www.facebook.com
Read 608312 from https://www.twitter.com/theghostyced
Read 11369 from https://www.google.com
Read 107149 from https://www.facebook.com
Read 608312 from https://www.twitter.com/theghostyced
Read 11365 from https://www.google.com
Read 107445 from https://www.facebook.com
Read 608077 from https://www.twitter.com/theghostyced
Read 11369 from https://www.google.com
Read 107351 from https://www.facebook.com
Read 608312 from https://www.twitter.com/theghostyced
Read 11369 from https://www.google.com
Read 107482 from https://www.facebook.com
Read 608312 from https://www.twitter.com/theghostyced
Downloaded 90 in 17.5553081035614 seconds
여기서 스크립트는 17.5초가 걸려야 임무를 완성할 수 있습니다.이제 다선정 방법으로 속도를 높일 수 있는지 다시 한 번 시도해 봅시다.다중 스레드 프로세스
# A simple python script that gets query a list of site
import requests
import time
import concurrent.futures
def get_single_site(url):
with requests.get(url) as response:
print(f"Read {len(response.content)} from {url}")
def get_all_sites(sites):
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
executor.map(get_single_site, sites)
if __name__ == "__main__":
start_time = time.time() # our scripts start time
sites = [
"https://www.google.com",
"https://www.facebook.com",
"https://www.twitter.com/theghostyced"
] * 30
get_all_sites(sites)
end_time = time.time() - start_time
print(f"Downloaded {len(sites)} in {end_time} seconds")
위 코드에서 파이톤 표준 라이브러리에서 가져왔습니다. concurrent.futures
module이 모듈에는 ThreadPoolExecutor
하위 클래스의 소스인 Executor 클래스가 있습니다.분석해 봅시다ThreadPoolExecutor
.ThreadPoolExecutor
하위 클래스가 하는 일은 Pool
개의 라인만 만드는 것입니다.Executor 섹션에서는 풀의 각 스레드의 작동 방법과 시간을 제어합니다.위 스크립트의 출력은 다음과 같습니다. -
...
Read 608312 from https://www.twitter.com/theghostyced
Read 11354 from https://www.google.com
Read 107810 from https://www.facebook.com
Read 608312 from https://www.twitter.com/theghostyced
Read 11343 from https://www.google.com
Read 107823 from https://www.facebook.com
Read 608312 from https://www.twitter.com/theghostyced
Read 11326 from https://www.google.com
Read 107388 from https://www.facebook.com
Read 11350 from https://www.google.com
Read 608312 from https://www.twitter.com/theghostyced
Read 107787 from https://www.facebook.com
Read 608311 from https://www.twitter.com/theghostyced
Read 608077 from https://www.twitter.com/theghostyced
Read 11299 from https://www.google.com
Read 11367 from https://www.google.com
Read 608312 from https://www.twitter.com/theghostyced
Read 107785 from https://www.facebook.com
Read 11321 from https://www.google.com
Read 107800 from https://www.facebook.com
Read 107350 from https://www.facebook.com
Read 608076 from https://www.twitter.com/theghostyced
Read 608312 from https://www.twitter.com/theghostyced
Read 608312 from https://www.twitter.com/theghostyced
Read 608311 from https://www.twitter.com/theghostyced
Downloaded 90 in 6.443061351776123 seconds
여기서 스크립트는 6.4초가 걸려야 임무를 완성할 수 있다.코드를 동기화하는 데 필요한 17.5초와 비교하면너는 너 자신에게 말할 수 있다 - 12초밖에 안 남았어, 받아들일 수 있어.만약 우리가 더 많은 데이터, 예를 들어 1000개를 가지고 있다면 당신은 이 두 가지 방법의 현저한 차이를 발견할 수 있을 것이다.다처리🧩
프로세스는 실행 중인 프로그램의 실례일 뿐입니다.텍스트 파일에서 컴퓨터 프로그램/스크립트를 작성하고 프로그램을 실행할 때, 이것은 프로그램/스크립트에서 언급한 모든 작업을 수행하는 과정으로 변한다.A
Process
는 Threads
등 다른 프로세스와 메모리 공간을 공유하지 않습니다.다중 처리는 한 컴퓨터 시스템에서 두 개 이상의 핵을 사용하는 것과 관련이 있다.기본적으로 Python은 다중 스레드를 지원하지 않습니다.🐍 프로그래밍 언어의 복잡성 때문에.
GIL 장애
파이톤은 Guido van Rossum이 1980년대에 개발한 것으로 당시 컴퓨터는 하나의 CPU만 사용했다. 메모리 관리를 늘리기 위해 GIL을 실현했고 한 라인만 파이톤 해석기를 제어할 수 있게 했다.여러 개의 CPU 코어를 사용하거나 개별 CPU를 병렬로 실행하는 것은 불가능하다는 것이다.
도입
multiprocessing module
은 이 점을 돌아서기 위한 것이다.NB -- The GIL does not prevent the creation of multiple threads. All the GIL does is make sure only one thread is executing Python code at a time; control still switches between threads. If you still having confusions, .
위의 동기화 코드를 사용하여 다중 처리 작업을 어떻게 하는지 설명합니다.
동기화 프로세스
# A simple python script that gets query a list of site
import requests
import time
def get_single_site(url):
with requests.get(url) as response:
print(f"Read {len(response.content)} from {url}")
def get_all_sites(sites):
for url in sites:
get_single_site(url, session)
if __name__ == "__main__":
start_time = time.time()
urls = [
"https://www.google.com",
"https://www.facebook.com",
"https://www.twitter.com/theghostyced"
] * 30
get_all_sites(urls)
end_time = time.time() - start_time
print(f"Downloaded {len(sites)} in {end_time} seconds")
다중 처리 방법# A simple python script that gets query a list of site
import requests
import time
import multiprocessing
def get_single_site(url):
with requests.get(url) as response:
print(f"Read {len(response.content)} from {url}")
def get_all_sites(sites):
with multiprocessing.Pool(5) as pool:
pool.map(get_single_site, sites)
if __name__ == "__main__":
start_time = time.time() # our scripts start time
sites = [
"https://www.google.com",
"https://www.facebook.com",
"https://www.twitter.com/theghostyced"
] * 30
get_all_sites(sites)
end_time = time.time() - start_time
print(f"Downloaded {len(sites)} in {end_time} seconds")
Python의 표준 라이브러리에서 멀티프로세서 패키지를 가져옵니다.다중 처리 모듈은 몇 개의 하위 프로세스와 풀을 가지고 있다.여기서 우리는
Pool
자류를 사용한다.Pool
생성해야 하는 노동자나 프로세스의 수를 첫 번째 매개 변수로 삼는다. 이것은 with multiprocessing.Pool(5) as pool:
줄에서 발생한 상황이다.pool.map(get_single_site, sites)
에서 우리는 연못에 제공된 맵 방법을 사용한다.이 방법은 호출할 함수를 첫 번째 인자로 하고 URL 목록의iterable를 두 번째 인자로 합니다.그리고 iterable를 몇 개의 블록으로 나누어 프로세스 탱크에 단독 작업으로 제출합니다.지정된 작업의 출력은 다음과 같습니다. -
...
Read 608423 from https://www.twitter.com/theghostyced
Read 108078 from https://www.facebook.com
Read 11386 from https://www.google.com
Read 11387 from https://www.google.com
Read 11304 from https://www.google.com
Read 11353 from https://www.google.com
Read 108021 from https://www.facebook.com
Read 107985 from https://www.facebook.com
Read 108022 from https://www.facebook.com
Read 608423 from https://www.twitter.com/theghostyced
Read 108079 from https://www.facebook.com
Read 608423 from https://www.twitter.com/theghostyced
Read 11340 from https://www.google.com
Read 608423 from https://www.twitter.com/theghostyced
Read 11321 from https://www.google.com
Read 608423 from https://www.twitter.com/theghostyced
Read 107985 from https://www.facebook.com
Read 608423 from https://www.twitter.com/theghostyced
Read 11384 from https://www.google.com
Read 107549 from https://www.facebook.com
Read 608423 from https://www.twitter.com/theghostyced
Read 11294 from https://www.google.com
Read 608423 from https://www.twitter.com/theghostyced
Read 107985 from https://www.facebook.com
Read 11360 from https://www.google.com
Read 609124 from https://www.twitter.com/theghostyced
Downloaded 90 in 6.056399154663086 seconds
여기서 스크립트는 6초가 걸려야 임무를 완성할 수 있으며, 라인 해결 방안보다 조금 빠르다.이것은 합리적인 것입니다. 실행 중인 작업은 경계가 있는 입출력이기 때문입니다.멀티 프로세싱은 대량의 데이터를 처리하는 것과 같은 CPU 제한 작업을 수행할 때 더욱 효과적입니다.결론
나는 지금 네가 스스로 시험해 보고 싶다는 것을 알고 있으니, 네가 시작하기 전에 언제 사용하고 나올지 주의해라.
너는 먼저 너의 절차가 CPU-bound or I/O-bound 인지 아닌지를 분명히 해야 한다.I/O 바인딩 프로그램은 이벤트가 발생할 때(외부 호출이나 요청)를 기다리는 데 대부분의 시간을 소비하는 프로그램이고, CPU 바인딩 프로그램은 가능한 한 빨리 데이터나 숫자를 처리하는 데 시간을 소비한다는 것을 기억하십시오.
따라서 I/O 바인딩 작업에는 멀티스레드가 가장 좋고 CPU 바인딩 작업에는 멀티스레드가 적합합니다.
👋 👋 👋 👋
미안하지만, 나는 네가 파이톤의 운행 속도를 어떻게 가속화하는지에 관한 강좌를 좋아하길 바란다🐍 각본
Reference
이 문제에 관하여(⚡ ️이글이글 구렁이🐍 동시 스크립트⚡️️), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/theghostyced/blazing-python-scripts-with-concurrency-59di텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)