비교 실험
데이터에 따르면 멀티 스레드 프로세스가 CPU 집약적이라면 멀티 스레드는 효율성을 크게 향상시키지 못하고 오히려 스레드를 자주 전환하여 효율성이 저하될 수 있습니다. . IO 집약적인 경우 멀티 프로세스를 사용하는 것이 좋습니다. 멀티 스레드 프로세스는 IO 차단이 다른 스레드를 실행하는 동안 유휴 시간을 사용하여 효율성을 높일 수 있습니다. 그래서 실험을 바탕으로 다양한 시나리오의 효율성을 비교합니다
(1) 필수 모듈 소개
import requests import time from threading import Thread from multiprocessing import Process
(2) CPU 집약적 컴퓨팅 정의 기능
def count(x, y): # 使程序完成150万计算 c = 0 while c < 500000: c += 1 x += x y += y
(3) IO 집약적인 파일 읽기 및 쓰기 기능 정의
def write(): f = open("test.txt", "w") for x in range(5000000): f.write("testwrite\n") f.close() def read(): f = open("test.txt", "r") lines = f.readlines() f.close()
(4) 네트워크 요청 기능 정의
_head = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'} url = "http://www.tieba.com" def http_request(): try: webPage = requests.get(url, headers=_head) html = webPage.text return {"context": html} except Exception as e: return {"error": e}
(5) 테스트 선형성 IO 집약적 작업, CPU 집약적 작업 및 네트워크 요청 집약적 작업을 수행하는 데 필요한 시간
# CPU密集操作 t = time.time() for x in range(10): count(1, 1) print("Line cpu", time.time() - t) # IO密集操作 t = time.time() for x in range(10): write() read() print("Line IO", time.time() - t) # 网络请求密集型操作 t = time.time() for x in range(10): http_request() print("Line Http Request", time.time() - t)
출력
CPU 집약적: 95.6059999466, 91.57099986076355 92.52800011634827, 99.967999 93515015
IO 집약적: 24.25, 21.76699995994568, 21.769999980926514, 22.060999870300293
네트워크 요청 집약적: 4.519999980926514, 8.56399989 1281128, 4.37 1000051498413, 4.522000074386597, 14.671000003814697
(6) 멀티 스레드 동시 테스트에 필요 CPU 집약적인 작업 실행 시간
counts = [] t = time.time() for x in range(10): thread = Thread(target=count, args=(1,1)) counts.append(thread) thread.start() e = counts.__len__() while True: for th in counts: if not th.is_alive(): e -= 1 if e <= 0: break print(time.time() - t)
출력: 99.9240000248, 101.26400017738342, 102.32200002670288
(7) IO 집약적인 작업의 멀티 스레드 동시 실행에 필요한 시간 테스트
def io(): write() read() t = time.time() ios = [] t = time.time() for x in range(10): thread = Thread(target=count, args=(1,1)) ios.append(thread) thread.start() e = ios.__len__() while True: for th in ios: if not th.is_alive(): e -= 1 if e <= 0: break print(time.time() - t)
출력: 25.69700002670288, 24.02400016784668
(8) 네트워크 집약적인 작업의 멀티 스레드 동시 실행에 필요한 시간 테스트
t = time.time() ios = [] t = time.time() for x in range(10): thread = Thread(target=http_request) ios.append(thread) thread.start() e = ios.__len__() while True: for th in ios: if not th.is_alive(): e -= 1 if e <= 0: break print("Thread Http Request", time.time() - t)
출력: 0.741999864578247 1, 0.3839998245239258, 0.3900001049041748
(9) 다중 프로세스 동시성 테스트 CPU 집약적 작업을 수행하는 데 필요한 시간
counts = [] t = time.time() for x in range(10): process = Process(target=count, args=(1,1)) counts.append(process) process.start() e = counts.__len__() while True: for th in counts: if not th.is_alive(): e -= 1 if e <= 0: break print("Multiprocess cpu", time.time() - t)
출력: 54.342000007629395, 53.437999963760376
( 10) 동시 실행 테스트 여러 프로세스에 의한 IO 집약적인 작업
t = time.time() ios = [] t = time.time() for x in range(10): process = Process(target=io) ios.append(process) process.start() e = ios.__len__() while True: for th in ios: if not th.is_alive(): e -= 1 if e <= 0: break print("Multiprocess IO", time.time() - t)
출력: 12.509000062942505, 13.059000015258789
(11) HTTP 요청 집약적인 작업을 동시에 실행하기 위해 여러 프로세스 테스트
t = time.time() httprs = [] t = time.time() for x in range(10): process = Process(target=http_request) ios.append(process) process.start() e = httprs.__len__() while True: for th in httprs: if not th.is_alive(): e -= 1 if e <= 0: break print("Multiprocess Http Request", time.time() - t)
출력: 0.5329999923706055, 0.476000070571 8994
실험 결과
위 결과를 통해 알 수 있습니다.
멀티 스레딩은 그렇지 않습니다. IO 집약적인 작업에 큰 이점이 있는 것 같습니다(아마도 IO 작업 작업이 더 무거워서 이점을 반영할 수 있음). CPU 집약적인 작업에서 단일 스레드의 선형 실행 성능은 분명히 단일 스레드의 성능보다 나쁩니다. 스레드를 차단하기 위해 대기하느라 바쁜 네트워크 요청과 같은 멀티스레딩의 장점은 매우 중요합니다
여러 프로세스는 CPU 집약적, IO 집약적, 네트워크 요청 집약적 작업(스레드 차단 작업이 자주 발생함)에서 성능 이점을 보여줄 수 있습니다. 그러나 네트워크 요청 집약적인 작업의 경우 멀티스레딩과 거의 동일하지만 CPU 등의 리소스를 더 많이 차지하므로 이 경우에는 멀티스레딩을 선택하여 실행하면 됩니다