1, 동시 프로그래밍에서 성능 관점에서 파이썬 동시 프로그래밍

  • 머리말
  • 동시 프로그래밍의 기본 개념
  • VS VS 멀티 스레드 멀티 프로세스를 단일 스레드
  • 연구 결과의 성능 비교 요약

머리말

고급 시리즈의 지점으로 " 并发编程,"나는이에 있어야 모든 프로그래머라고 생각합니다.

并发编程 이 시리즈는, 당신이 더 철저하게하기 위해 예를 인용,이 지식을 발견하는 것이 쉽게 이해하고 싶은 생각, 지식을 빗질, 거의 일주일 동안 준비했다. 결과의 발표가 진짜로 흰색에 너무 친절하고, 그것을 상상 바랍니다.

어제는 대략 아마 다음을 (후자는 조정할 수 있습니다) 말을이 시리즈를 마무리 :

과정 개요과정 개요

동시 프로그래밍, 파이썬 구현은, 무엇을, 대략 다음과 같은 세 가지 방법을 요약 :

  • 멀티 스레딩
  • 멀티 프로세스
  • 코 루틴 (발전기)

다음 장에서 우리는이 세 가지 지식 점에 대해 당신에게 또 다른 후가 될 것입니다.

동시 프로그래밍의 기본 개념

당신이 지식의 이론을 설명하기 시작하기 전에 몇 가지 기본 개념에 하나 개의 모양을했다. 그것은 고급 과정이지만, 나 또한 더 사용자 친화적 인, 더 화이트 쓰고 싶어하지만.

串行: 동시에 사람이 그러한 TV를 시청하는 저녁 식사 이후로, 하나의 일을 할 수 있습니다
并行: 같은 기간에 사람이 더 많거나 일이 될 수 있습니다 TV를 보면서 예를 들어, 당신은 먹을 수 있습니다;

파이썬에서, 多线程 그리고  协程 엄밀히 말하면 비록 직렬이지만, 매우 시리얼 프로그램의 구현의 평균 효율보다.
프로그램이 차단 만 다른 일을 할 수 없어, 대기 할 수있는 일반 시리얼 프로그램. 마찬가지로, TV 드라마 방영, 광고 시간에, 우리는 식사를하기 위해 광고 시간을 활용할 수 없습니다. 프로그램의 경우,이는 불합리한, 분명히 매우 낮은 효율성이다.

물론,이 과정의 완료 후, 우리는 광고 시간의 사용이 다른 것들, 유연한 시간표을 할 수 있음을 이해합니다. 우리는 이유입니다 多线程그리고 协程 당신이 프로그램의 최대 효율을 만드는 일, 내부 합리적인 관리 작업을 수행하는 데 도움이하고 싶다.

비록  多线程 및  协程 아주 똑똑한. 채팅 텔레비전을 시청하는 동안 그러나 아직도 효율적인 충분이, 가장 효율적인 멀티 태스킹 있어야 먹는다. 이것은 우리입니다  多进程 일을 할 수있는 능력.

도움말을 당신은 더 나은에 생생하게 멀티 스레드 및 멀티 프로세스의 차이를 설명, 인터넷에서이 사진을 찾을 수보다 직관적 인 이해합니다. (침략 삭제)

  • 多线程다른 방법으로는 또 다른 의미에서, 시리얼을 실행.

  • 多进程진정한 의미에서 동시 병렬.

. VS 멀티 스레드 멀티 프로세스 VS 단일 스레드

텍스트는 항상없는 몇 줄의 코드가 Kongwuyouli 올 천 개 단어 좋은으로 창백.

우선, 내 테스트 환경 구성은 다음입니다

운영 체제 CPU 코어의 수 메모리 (G) 하드 디스크
CentOS는 7.2 24 핵 (32) 기계 하드 드라이브

하는 것으로
다음과 같은 코드가 이해하는 흰색 점을 그 지식을 가지고 :

  1. 데코레이터를 사용하여
  2. 기본 사용 멀티 스레딩
  3. 여러 프로세스의 기본 사용

물론, 그것은, 주요 결론, 멀티 스레드, 다중 프로세스가 단일 스레드,이 효과를 달성하기 위해,이 문서의 임무가 종료, 대기 때까지 마지막의 실현에 대한 일반적인 효과에 대한 명확한 이해를 모든 사람에게 중요하지가 허용 않습니다 이해가 안 돼요 주변에 다시 와서 더 깊은 이해가있을 수 있습니다 이해하실 수 있습니다, 전체 시리즈를 배운다.

단일 스레드, 우리가 보자, 멀티 스레드 및 멀티 프로세스, 강하거나 작동 약한 여부.

당신은 비교를 시작하기 전에, 먼저 시나리오의 네 가지 유형을 정의

  • CPU 집약적 인 컴퓨팅
  • 디스크 IO 집중
  • IO 집약적 인 네트워크
  • 아날로그 IO 집중적 []

왜 시나리오 이러한 유형이 있고,이 多线程 多进程장면에 적용됩니다. 결론적으로 설명해 보자.

# CPU计算密集型
def count(x=1, y=1):
    # 使程序完成150万计算
    c = 0
    while c < 500000:
        c += 1
        x += x
        y += y


# 磁盘读写IO密集型
def io_disk():
    with open("file.txt", "w") as f:
        for x in range(5000000):
            f.write("python-learning\n")


# 网络IO密集型
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'}
url = "https://www.tieba.com/"

def io_request():
    try:
        webPage = requests.get(url, headers=header)
        html = webPage.text
        return
    except Exception as e:
        return {"error": e}


# 【模拟】IO密集型
def io_simulation():
    time.sleep(2)

경기 지표는 우리가 생각하는 시간을 사용합니다. 적은 시간, 더 높은 효율성을 보냈다.

편의를 위해,보다 간결, 내가 여기 코드 모양을 만드는 간단한 정의하는 것입니다  时间计时器 장식합니다.
당신은 매우 장식으로 이해하지 않으면 당신이 그것에 시간의 함수를 계산하는 데 사용됩니다 알고만큼, 그것은 중요하지 않습니다.

def timer(mode):
    def wrapper(func):
        def deco(*args, **kw):
            type = kw.setdefault('type', None)
            t1=time.time()
            func(*args, **kw)
            t2=time.time()
            cost_time = t2-t1
            print("{}-{}花费时间:{}秒".format(mode, type,cost_time))
        return deco
    return wrapper

첫 번째 단계는 단일 스레드에서보세요

@timer("【单线程】")
def single_thread(func, type=""):
    for i in range(10):
              func()

# 单线程
single_thread(count, type="CPU计算密集型")
single_thread(io_disk, type="磁盘IO密集型")
single_thread(io_request,type="网络IO密集型")
single_thread(io_simulation,type="模拟IO密集型")

결과를 봐

【单线程】-CPU计算密集型花费时间:83.42633867263794秒
【单线程】-磁盘IO密集型花费时间:15.641993284225464秒
【单线程】-网络IO密集型花费时间:1.1397218704223633秒
【单线程】-模拟IO密集型花费时间:20.020972728729248秒

두 번째 단계, 멀티 스레드 봐

@timer("【多线程】")
def multi_thread(func, type=""):
    thread_list = []
    for i in range(10):
        t=Thread(target=func, args=())
        thread_list.append(t)
        t.start()
    e = len(thread_list)

    while True:
        for th in thread_list:
            if not th.is_alive():
                e -= 1
        if e <= 0:
            break

# 多线程
multi_thread(count, type="CPU计算密集型")
multi_thread(io_disk, type="磁盘IO密集型")
multi_thread(io_request, type="网络IO密集型")
multi_thread(io_simulation, type="模拟IO密集型")

결과를 봐

【多线程】-CPU计算密集型花费时间:93.82986998558044秒
【多线程】-磁盘IO密集型花费时间:13.270896911621094秒
【多线程】-网络IO密集型花费时间:0.1828296184539795秒
【多线程】-模拟IO密集型花费时间:2.0288875102996826秒

세 번째 단계는 마지막 다중 프로세스 살펴 보는 것입니다

@timer("【多进程】")
def multi_process(func, type=""):
    process_list = []
    for x in range(10):
        p = Process(target=func, args=())
        process_list.append(p)
        p.start()
    e = process_list.__len__()

    while True:
        for pr in process_list:
            if not pr.is_alive():
                e -= 1
        if e <= 0:
            break

# 多进程
multi_process(count, type="CPU计算密集型")
multi_process(io_disk, type="磁盘IO密集型")
multi_process(io_request, type="网络IO密集型")
multi_process(io_simulation, type="模拟IO密集型")

결과를 봐

【多进程】-CPU计算密集型花费时间:9.082211017608643秒
【多进程】-磁盘IO密集型花费时间:1.287339448928833秒
【多进程】-网络IO密集型花费时间:0.13074755668640137秒
【多进程】-模拟IO密集型花费时间:2.0076842308044434秒

결과 요약의 성능 비교

결과는 표로 그것을 요약되어있다.

CPU 집약적 인 컴퓨팅 디스크 IO 집중 IO 집약적 인 네트워크 아날로그 IO 집약적
단일 스레드 83.42 15.64 1.13 20.02
멀티 스레딩 93.82 13.27 0.18 2.02
멀티 프로세스 9.08 1.28 0.13 2.01

우리는이 양식을 분석해야한다.

첫 번째 CPU密集型는 같은 시간 계산에 둘 이상의 CPU이기 때문에, 스레드 및 시간이 많이 소요되는 비효율적, 멀티 프로세스 전환, 외관상으로 인해 지속적인 글로벌 잠금 GIL 잠금 릴리스, 멀티 스레드 단일 스레드뿐만 아니라 어떤 장점을 비교 없습니다 10 명에 해당 분명히 효율이 기하 급수적으로 성장하고, 사람의 일을하고 있어요.

그런 다음 집약적 인 IO는 IO密集型할 수있다 磁盘IO, 网络IO, 数据库IO등, 같은 클래스에 속하는 모든 매우 작은 시간의 대부분은 낭비 IO를 기다리는되는 양을 계산합니다. 관찰을 통해, 우리는 우리의 디스크 IO가, IO 데이터 네트워크에 큰 장점을 반영하지 않은 단일 스레드 비교 멀티 스레드 찾을 수 있습니다. 장점은 명확하지 않다, 그래서 무거운 이것은 우리의 프로그램의 IO 작업에 기인하지 않습니다.

나는 또한 "추가 그래서 模拟IO密集型,"사용 sleep입출력 대기 시간을 시뮬레이션하는 멀티 스레딩의 장점을 반영하는 것입니다, 또한 우리에게 멀티 스레드 처리 작업을보다 직관적 인 이해를 할 수 있습니다. 각 스레드는 단일 스레드 할 필요가 sleep(2)스레드는 10 20s, 및 멀티 스레딩에 sleep(2)시간, 같은 시간에 10 개 스레드 그래서, 다른 스레드로 전환됩니다 sleep(2), 그것은 단지 마지막 10 개 스레드했다 2s.

다음과 같은 결론을 그릴 수 있습니다

  • 항상 느린 단일 스레드, 다중 프로세스는 항상 가장 빠른 것입니다.
  • 에서 사용하기에 적합 같은 파충류, 웹 사이트 개발 등의 IO 집약적 인 장면을 멀티 스레드
  • 는 CPU의 계산에 필요한 높은 운영 시나리오에 다수의 프로세스에 사용하기 적합한 이러한 큰 데이터 분석과 같은, 기계 학습
  • 이 지원 낮은 CPU 리소스의 이점을 실현하기 위해 필요하기 때문에 멀티 프로세스는 가장 빠르게, 그러나 반드시 최선의 선택은 항상 있지만
게시 91 개 원래 기사 · 원 찬양 47 ·은 90000 +를 볼

추천

출처blog.csdn.net/qq_30007885/article/details/102565667