>  기사  >  백엔드 개발  >  멀티스레딩이 싱글스레딩보다 빠르다는 것이 사실인가요?

멀티스레딩이 싱글스레딩보다 빠르다는 것이 사실인가요?

coldplay.xixi
coldplay.xixi앞으로
2020-11-09 17:11:403129검색

pyrhon 동영상 튜토리얼 칼럼에서는 멀티스레딩이 실제로 싱글스레딩보다 빠른지 소개합니다.

멀티스레딩이 싱글스레딩보다 빠르다는 것이 사실인가요?

실제로 Python 멀티스레딩의 또 다른 매우 중요한 주제는 GIL(Global Interpreter Lock, 즉 전역 인터프리터 잠금)입니다. GILGlobal Interpreter Lock,即全局解释器锁)。

多线程不一定比单线程快

在Python中,可以通过多进程、多线程和多协程来实现多任务。难道多线程就一定比单线程快?

下面我用一段代码证明我自己得观点。

'''
@Author: Runsen
@微信公众号: Python之王
@博客: https://blog.csdn.net/weixin_44510615
@Date: 2020/6/4
'''import threading, timedef my_counter():
    i = 0
    for _ in range(100000000):
        i = i+1
    return Truedef main1():
    start_time = time.time()    for tid in range(2):
        t = threading.Thread(target=my_counter)
        t.start()
        t.join()  # 第一次循环的时候join方法引起主线程阻塞,但第二个线程并没有启动,所以两个线程是顺序执行的

    print("单线程顺序执行total_time: {}".format(time.time() - start_time))def main2():
    thread_ary = {}
    start_time = time.time()    for tid in range(2):
        t = threading.Thread(target=my_counter)
        t.start()
        thread_ary[tid] = t    for i in range(2):
        thread_ary[i].join()  # 两个线程均已启动,所以两个线程是并发的

    print("多线程执行total_time: {}".format(time.time() - start_time))if __name__ == "__main__":
    main1()
    main2()复制代码

运行结果

单线程顺序执行total_time: 17.754502773284912多线程执行total_time: 20.01178550720215复制代码

我怕你说我乱得出来得结果,我还是截个图看清楚点

这时,我怀疑:我的机器出问题了吗?其实不是这样,本质上来说Python 的线程失效了,没有起到并行计算的作用。

Python 的线程,的确封装了底层的操作系统线程,在 Linux 系统里是 Pthread(全称为 POSIX Thread),而在 Windows 系统里是 Windows Thread

여러 스레드가 반드시 단일 스레드보다 빠른 것은 아닙니다.

Python에서는 다중 프로세스, 다중 스레드 및 다중 코루틴을 통해 다중 작업을 수행할 수 있습니다. 멀티스레딩이 싱글스레딩보다 반드시 더 빠릅니까?

아래에서는 내 주장을 증명하기 위해 코드를 사용합니다.

'''
@Author: Runsen
@微信公众号: Python之王
@博客: https://blog.csdn.net/weixin_44510615
@Date: 2020/6/4
'''import time
COUNT = 50_000_000def count_down():
   global COUNT   while COUNT > 0:
       COUNT -= 1s = time.perf_counter()
count_down()
c = time.perf_counter() - s
print('time taken in seconds - >:', c)

time taken in seconds - >: 9.2957003复制代码
실행 결과

'''
@Author: Runsen
@微信公众号: Python之王
@博客: https://blog.csdn.net/weixin_44510615
@Date: 2020/6/4
'''import timefrom threading import Thread

COUNT = 50_000_000def count_down():
   global COUNT   while COUNT > 0:
       COUNT -= 1s = time.perf_counter()
t1 = Thread(target=count_down)
t2 = Thread(target=count_down)
t1.start()
t2.start()
t1.join()
t2.join()
c = time.perf_counter() - s
print('time taken in seconds - >:', c)

time taken in seconds - >: 17.110625复制代码

결과를 망쳤다고 말씀하실까봐 걱정되니까 스크린샷을 찍어서 좀 더 명확하게 확인하는 게 좋을 것 같아요

이때 궁금했어요 : 내 기계에 문제가 있나요? 사실, 이것은 사실이 아닙니다. 본질적으로 Python의 스레드는 실패했으며 병렬 컴퓨팅에서 역할을 수행하지 않습니다.

Python의 스레드는 기본 운영 체제 스레드를 캡슐화하지만 Linux 시스템에서는 Pthread(전체 이름: POSIX Thread)입니다. Windows 스레드. 또한 Python의 스레드는 실행 시기 조정, 메모리 리소스 관리, 인터럽트 관리 등 운영 체제에서 완벽하게 관리됩니다.

GIL은 Python의 기능이 아닙니다GIL의 개념은 간단한 문장으로 설명할 수 있습니다.

언제든지 스레드 수에 관계없이 단일 CPython 인터프리터는 하나의 바이트코드만 실행할 수 있습니다

. 이 정의에 대한 주의 사항: 먼저 명확하게 해야 할 것은

GIL은 Python의 기능이 아니며

Python 파서(CPython)를 구현할 때 도입된 개념이라는 것입니다.

C++는 언어(문법) 표준의 집합이지만 다른 컴파일러를 사용하여 실행 가능한 코드로 컴파일될 수 있습니다. GCC, INTEL C++, Visual C++ 등과 같은 유명한 컴파일러.

Python도 마찬가지입니다. CPython, PyPy, Psyco 등 다양한 Python 실행 환경을 통해 동일한 코드를 실행할 수 있습니다.

다른 Python 인터프리터에는 GIL

이 없을 수도 있습니다. 예를 들어 Jython(JVM)과 IronPython(CLR)에는 GIL이 없지만 CPython과 PyPy에는 GIL이 있습니다.

CPython은 대부분의 환경에서 기본 Python 실행 환경이기 때문입니다. 따라서 많은 사람들의 개념에서는 CPython이 Python이고 GIL이 Python 언어의 결함이라고 당연하게 여깁니다. 따라서 여기서 명확하게 설명하겠습니다.

GIL은 Python의 기능이 아닙니다. Python은 GIL에 전혀 의존할 필요가 없습니다.

GIL은 기본적으로 뮤텍스 잠금입니다. 뮤텍스 잠금, 모든 뮤텍스 잠금의 본질은 동일합니다. 동시 작업을 직렬 작업으로 전환하여 동시에 하나의 작업에서만 공유 데이터를 수정할 수 있도록 제어하여 데이터 보안을 보장합니다.

한 가지 확실한 점은 다양한 데이터의 보안을 보호하려면 다양한 잠금 장치를 추가해야 한다는 것입니다.

GIL 작동 방식: 예를 들어 아래 그림은 Python 프로그램에서 GIL이 작동하는 방식의 예입니다. 그 중 스레드 1, 2, 3이 차례로 실행됩니다. 각 스레드가 실행을 시작하면 마찬가지로 다른 스레드가 실행되지 않도록 GIL을 잠그고, 각 스레드가 일정 기간 동안 실행을 마친 후 GIL을 해제합니다. 다른 스레드가 실행되도록 허용합니다. 스레드가 리소스를 활용하기 시작합니다.

컴퓨팅 집약적 컴퓨팅 집약적 작업은 많은 양의 계산과 CPU 리소스 소비가 특징입니다.

먼저 계산 중심의 간단한 예를 살펴보겠습니다.

rrreee이것은 단일 스레드이고 시간은 9초입니다. 두 개의 스레드를 사용하여 결과가 무엇인지 살펴보겠습니다. rrreee

우리 프로그램의 주요 작업은 계산입니다. CPU는 기다리지 않지만 멀티스레딩으로 변경한 후 스레드를 추가한 후 스레드 간을 자주 전환하면 시간 오버헤드가 증가하고 시간도 당연히 늘어납니다.
🎜또 다른 유형은 IO 집약적입니다. 네트워크 및 디스크 IO와 관련된 작업은 모두 IO 집약적 작업입니다. 이 유형의 작업의 특징은 CPU 소비가 매우 적고 대부분의 작업이 IO 작업을 기다리고 있다는 것입니다. 완료됩니다(IO의 속도가 CPU 및 메모리의 속도보다 훨씬 낮기 때문입니다). IO 집약적인 작업의 경우 작업이 많을수록 CPU 효율성은 높아지지만 한계가 있습니다. 가장 일반적인 작업은 웹 애플리케이션과 같은 IO 집약적인 작업입니다. 🎜🎜🎜요약: io 집약적인 작업(Python 크롤러)의 경우 멀티스레딩을 사용하면 코드 효율성을 크게 향상시킬 수 있습니다. CPU 집약적인 컴퓨팅(Python 데이터 분석, 기계 학습, 딥 러닝)의 경우 멀티 스레딩은 단일 스레딩보다 효율성이 약간 떨어질 수 있습니다. 따라서 데이터 분야에서 효율성을 높일 수 있는 멀티스레딩 같은 것은 존재하지 않습니다. 컴퓨팅 파워를 향상시킬 수 있는 유일한 방법은 CPU를 GPU와 TPU로 업그레이드하는 것입니다. 🎜🎜🎜🎜관련 무료 학습 권장사항: 🎜python 비디오 튜토리얼🎜🎜🎜

위 내용은 멀티스레딩이 싱글스레딩보다 빠르다는 것이 사실인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제