python 파충류 의 스 레 드 탱크 와 프로 세 스 탱크 기능 및 용법 상세 설명
수요
최근 한 전자상거래 사이트 의 데 이 터 를 얻 으 려 고 합 니 다.프 록 시,분포 식 을 고려 하지 않 고 효율 문 제 를 먼저 말 하 겠 습 니 다.보통 하 얀 우리 가 제일 먼저 생각 하 는 것 은 for 순환 인 데 이것 은 단일 스 레 드 입 니 다.그러면 우 리 는 for 순환 을 고려 하여 그 에 게 5 개의 스 레 드 를 직접 열 었 습 니 다.문제 가 생 겼 습 니 다.만약 에 url 요청 이 아직 돌아 오지 않 았 다 면 뒤의 것 은 기다 리 겠 습 니 다.이렇게 많은 스 레 드 를 사용 하 는 것 은 소 용이 없 는 것 과 같 습 니 다.여기저기 반 창 고 를 붙 입 니 다.
2.성능 고려
다 중 스 레 드 나 다 중 프로 세 스 를 사용 해 야 하 는 지 확인 합 니 다.다 중 스 레 드 를 사용 하 는 지,다 중 프로 세 스 를 사용 하 는 지,어떤 사람들 은 다 중 프로 세 스 와 다 중 스 레 드 에 대해 어느 정도 편견 을 가지 고 있 습 니 다.python 의 GIL 잠 금 때문에 이 두 가지 차이 점 을 말씀 드 리 겠 습 니 다.
3.다 중 스 레 드:
일반적인 상황 에서 우리 가.py 파일 을 시작 하 는 것 은 하나의 프로 세 스 를 시작 하 는 것 과 같 습 니 다.하나의 프로 세 스 에 기본적으로 하나의 스 레 드 작업 이 있 습 니 다.우리 가 사용 하 는 다 중 스 레 드 는 하나의 프로 세 스 에서 여러 스 레 드 를 사용 한 다 는 뜻 입 니 다.그런데 문제 가 생 겼 어 요.왜 다 중 스 레 드 를 사용 하 세 요?프로 세 스 를 시작 할 때 메모리 공간 을 만들어 야 한 다 는 것 을 알 고 있 습 니 다.우 리 는 이 집에 서 일 을 해 야 합 니 다.한 사람 이 하나의 스 레 드 와 같다 고 생각 할 수 있 습 니 다.당신 의 집 안에 10 명의 공간 이 있 고 20 명의 공간 이 있 습 니 다.정상 적 인 상황 에서 다 릅 니 다.우 리 는 스 레 드 와 스 레 드 사이 의 기본 값 은 통신 할 수 있다 는 것 을 알 고 있 기 때문이다.(프로 세 스 간 의 기본 값 은 통신 할 수 없 지만 기술 로 이 루어 질 수 있다.예 를 들 어 파이프)다 중 스 레 드 는 계산 데이터 의 정확성 을 확보 하기 위해 GIL 잠 금 이 생 겨 같은 시간 에 한 스 레 드 만 계산 할 수 있 도록 합 니 다.GIL 자 물 쇠 는 기본적으로 이해 할 수 있 습 니 다.예 를 들 어 이 방 에서 계산 을 해 야 합 니 다.같은 시간 에 한 사람 만 이 계산 을 하고 있 습 니 다.문 제 를 생각 할 수 있 습 니 다.만약 에 이 계산 을 다섯 사람 이 계산 할 수 있다 면 저 는 10 평방미터 의 방 이 필요 합 니 다.그런데 왜 10 명 을 초대 하고 20 평 미 터 를 써 야 합 니까?그래서 스 레 드 가 많 을 수록 좋 은 것 은 아니다.단,단,여러분 은 머리 를 쓰 지 않 아 도 됩 니 다(CPU 계산).이 계산 을 할 때 다른 일 을 할 수 있 습 니 다(예 를 들 어 5 명 이 분업 하고 각각 일부분 을 계산 합 니 다).예 를 들 어 각자 가 계산 한 결 과 를 장부 에 기록 하여 나중에 계산 할 수 있 도록 합 니 다.이것 은 모든 사람 이 자신의 장 부 를 가지 고 있 기 때문에 다 중 스 레 드 는 IO 작업 에 적합 합 니 다.IO 조작 에 적합 하 다 고 해서 사람 이 많 을 수록 좋다 는 뜻 은 아니 므 로 이 양은 실제 상황 에 따라 정 해 야 한 다 는 것 을 명심 하 세 요.
스 레 드 탱크 예제:
import requests
from concurrent.futures import ThreadPoolExecutor
urls_list = [
'https://www.baidu.com',
'http://www.gaosiedu.com',
'https://www.jd.com',
'https://www.taobao.com',
'https://news.baidu.com',
]
pool = ThreadPoolExecutor(3)
def request(url):
response = requests.get(url)
return response
def read_data(future,*args,**kwargs):
response = future.result()
response.encoding = 'utf-8'
print(response.status_code,response.url)
def main():
for url in urls_list:
done = pool.submit(request,url)
done.add_done_callback(read_data)
if __name__ == '__main__':
main()
pool.shutdown(wait=True)
4.다 중 프로 세 스:위 에서 다 중 스 레 드(스 레 드 풀)를 소 개 했 습 니 다.지금 우 리 는 프로 세 스 풀 에 대해 이야기 합 니 다.우 리 는 하나의 프로 세 스 가 하나의 CPU 를 차지 하 는 것 을 알 고 있 습 니 다.현재 설정 CPU 는 보통 4 핵 입 니 다.우 리 는 두 프로 세 스 를 시작 하 는 것 은 각각 두 개의 CPU 에서(두 개의 커 널)각각 하나의 프로 세 스 를 실행 하 는 것 입 니 다.프로 세 스 안에 스 레 드 가 있다 는 것 을 알 고 있 습 니 다.기본 값 은 하나그러나 위의 말 에 따 르 면 두 프로 세 스 가 사용 하 는 메모리 공간 은 하나의 프로 세 스 가 메모리 공간 을 차지 하 는 2 배 라 는 단점 이 있다.CPU 가 두 개의 핵 을 점용 하 였 으 니 컴퓨터 는 또 다른 일 을 해 야 한다.그렇지,경솔하게 함부로 써 서 는 안 된다.너무 많이 켜 면 다른 프로그램 이 기 다 려 야 하 는 것 이 아 닙 니까?이렇게 많은 메모리 공간 을 차지 하고 여러 CPU 의 장점 을 이용 한 것 은 무엇 입 니까?CPU 는 무엇 에 쓰 입 니까?맞습니다.계산 에 사용 되 기 때문에 CPU 밀집 연산 의 경우 다 중 프로 세 스 를 사용 하 는 것 을 권장 합 니 다.구체 적 으로 몇 개의 프로 세 스 를 열 어야 하 며,기계 의 실제 배치 와 실제 생산 상황 에 따라 결정 해 야 합 니 다.
프로 세 스 풀
import requests
from concurrent.futures import ProcessPoolExecutor
urls_list = [
'https://www.baidu.com',
'http://www.gaosiedu.com',
'https://www.jd.com',
'https://www.taobao.com',
'https://news.baidu.com',
]
pool = ProcessPoolExecutor(3)
def request(url):
response = requests.get(url)
return response
def read_data(future,*args,**kwargs):
response = future.result()
response.encoding = 'utf-8'
print(response.status_code,response.url)
def main():
for url in urls_list:
done = pool.submit(request,url)
done.add_done_callback(read_data)
if __name__ == '__main__':
main()
pool.shutdown(wait=True)
요약:1.다 중 스 레 드 는 IO 밀집 형 프로그램 에 적합 합 니 다.
2.다 중 프로 세 스 는 CPU 밀집 연산 프로그램 에 적합 합 니 다.
5.협의 과정:
협 정:마이크로 스 레 드 섬유 정 이 라 고도 부른다.영어 이름 Corontine.그 협 정 은 도대체 무엇 입 니까?쉽게 말 하면 스 레 드 보다 더 작은 스 레 드 이기 때문에 마이크로 스 레 드 라 고 합 니 다.
주요 역할:질문 이 있 습 니 다.python 에서 스 레 드 는 원자 조작(한 마디 또는 한 동작 으로 해결 할 수 있 는 조작 이나 계산)입 니 다.어떻게 협 정 이라는 것 이 있 습 니까?
장점:
1.높 은 병발,높 은 확장,낮은 성능 을 사용 하 는 경우;하나의 CPU 가 수만 명의 협 정 을 지지 하 는 것 도 문제 가 되 지 않 는 다.그래서 높 은 병행 처리 에 적합 합 니 다.
2.스 레 드 가 필요 없 는 문맥 전환 비용(얼핏 보면 무슨 뜻 입 니까?우 리 는 python 이 실제 적 으로 단일 스 레 드 라 는 것 을 알 고 있 습 니 다.그것 은 어떻게 높 은 병행 작업 을 실현 하 는 것 입 니까?바로 CPU 의 빠 른 전환 입 니 다.모든 임 무 를 조금씩 하고 마지막 에 같이 일 을 끝 내 는 것 처럼 보 입 니 다.육안 으로 는 다 중 스 레 드,다 중 프로 세 스 입 니 다)
단점:
1.CPU 의 다 핵 장점 을 이용 할 수 없습니다.이것 은 이해 하기 쉽 습 니 다.프로 세 스 안에 스 레 드 가 포함 되 어 있 습 니 다.협 정 은 세분 화 된 스 레 드 입 니 다.즉,한 프로 세 스 안에 먼저 스 레 드 가 있 고 그 다음 에 협 정 입 니 다.그러면 다 핵 을 사용 할 수 없 을 것 입 니 다.그러나 다 중 프로 세 스 가 협조 할 수 있 고 CPU 의 밀집 연산 을 사용 할 수 있 습 니 다.평소에 우 리 는 사용 할 수 없습니다.
일반적인 상황 에서 비교적 많이 사용 하 는 것 은 asyncio 또는 gevent 라 는 두 가지 기술 로 협 정 을 실현 하 는 것 이다.asyncio 는 python 이 자체 적 으로 가지 고 있 는 기술 로 gevent 제3자 라 이브 러 리 로 개인 적 으로 gevent 라 는 기술 을 비교적 좋아한다.
gevent:
설치:gevent 는 greenlet 라 이브 러 리 를 사 용 했 기 때문에 greenlet 을 설치 해 야 합 니 다.
pip3 install greenlet
pip3 install gevent
1.gevent 의 기본 적 인 실현 은 아래 의 쓰기 방법 에 따라 프로그램 이 시 작 된 후에 많은 협 정 이 열 리 고 오히려 성능 에 영향 을 줄 것 입 니 다.gevent+requests:
import requests
import gevent
from gevent import monkey
# IO , , gevent ( )
monkey.patch_all()
def task(url):
'''
1、request
:param url:
:return:
'''
response = requests.get(url)
print(response.status_code)
gevent.joinall([
gevent.spawn(task,url='https://www.baidu.com'),
gevent.spawn(task,url='http://www.sina.com.cn'),
gevent.spawn(task,url='https://news.baidu.com'),
])
2.한 가지 개선 버 전 은 한 번 에 몇 개의 요 구 를 할 수 있 는 지 설정 할 수 있 습 니 다(잊 혀 졌 습 니 다.협 정=높 은 병행 현실 중 하나).사실은 gevnet 아래 pool 모듈 에 있 는 Pool 을 이용 하여 매번 요청 한 수량 을 제어 하 는 것 입 니 다.gevent+reqeust+Pool(매번 요청 수량 제어)
import requests
import gevent
from gevent import monkey
from gevent.pool import Pool
# IO , , gevent ( )
monkey.patch_all()
def task(url):
'''
1、request
:param url:
:return:
'''
response = requests.get(url)
print(response.status_code)
# ,None
pool = Pool(5)
gevent.joinall([
pool.spawn(task,url='https://www.baidu.com'),
pool.spawn(task,url='http://www.sina.com.cn'),
pool.spawn(task,url='https://news.baidu.com'),
])
3.또 하나의 버 전이 있 습 니 다.매번 에 우 리 는 greenlet 과 gevent 를 설치 해 야 합 니 다.이것 은 어 쩔 수 없 는 것 입 니 다.그러나 우리 가 위 에 쓴 이 개선 판 은 좀 번 거 로 웠 습 니 다.그래서 누군가가 100 여 줄 의 코드 를 써 서 그들 을 함께 만 들 었 습 니 다.맞 아,바로 grequests 라 고 하 는데 바로 전자 두 기술 의 결합 입 니 다.
pip3 install grequests
이 버 전 은 너무 변태 적 이지 않 습 니까?requests,greenlet,gevent,Pool 을 직접 가 져 왔 습 니 다.하지만 포장 은 해 야 합 니 다.아래 코드 에서 Pool 의 인 자 를 보지 못 했다 고 합 니 다.grequests.map(requestlist,size=5),size 는 바로 당신 이 동시에 몇 개의 협 정 을 열 려 고 하 는 것 입 니 다.그리고 매개 변 수 는 당신 이 눌 러 서 들 어가 봐 야 합 니 다.정말 대단 하지 않 습 니까?아주 쉽 습 니 다.grequests:
import grequests
request_list = [
grequests.get('https://www.baidu.com'),
grequests.get('http://www.sina.com.cn'),
grequests.get('https://news.baidu.com'),
]
# ##### #####
response_list = grequests.map(request_list,size=5)
print(response_list)
결 과 는 목록 을 되 돌려 줍 니 다.다시 교체 하면 됩 니 다.더 많은 파 이 썬 관련 내용 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.,,,,,,,,,,,,,,,,
본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.