과 Pool
의 차이점은 multiprocessing
입니다. 내가 볼Python 멀티 프로세싱 모듈에서 ThreadPool과 Pool의 차이점
from multiprocessing.pool import ThreadPool
import os, time
print("hi outside of main()")
def hello(x):
print("inside hello()")
print("Proccess id: ", os.getpid())
time.sleep(3)
return x*x
if __name__ == "__main__":
p = ThreadPool(5)
pool_output = p.map(hello, range(3))
print(pool_output)
"ThreadPool이"로
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
hi outside of main()
inside hello()
Proccess id: 13268
inside hello()
Proccess id: 11104
inside hello()
Proccess id: 13064
[0, 1, 4]
: 나는 다음과 같은 출력을 볼
from multiprocessing import Pool
import os, time
print("hi outside of main()")
def hello(x):
print("inside hello()")
print("Proccess id: ", os.getpid())
time.sleep(3)
return x*x
if __name__ == "__main__":
p = Pool(5)
pool_output = p.map(hello, range(3))
print(pool_output)
: 내 코드를하려고하면,이 메인 내가 볼 차이 다음 출력 :
hi outside of main()
inside hello()
inside hello()
Proccess id: 15204
Proccess id: 15204
inside hello()
Proccess id: 15204
[0, 1, 4]
내 질문 TIONS은 다음과 같습니다
는은 왜 "외부 __main의 __은()"를
Pool
의 때마다 실행됩니다?multiprocessing.pool.ThreadPool
새 프로세스가 생성되지 않습니까? 단지 새로운 스레드를 생성합니까?그렇다면 을 사용하는 것과 단지
threading
모듈을 사용하는 것의 차이점은 무엇입니까?
어디서나 ThreadPool
에 대한 공식 설명서가 보이지 않지만 누군가 내가 도와 줄 수 있습니까?
아시다시피 파이썬의 GIL 때문에 파이썬의 멀티 스레딩은 멀티 스레드처럼 보입니다.하지만 실제는 아닙니다. 파이썬으로 멀티 코어를 이용하려면 멀티 프로세싱을 사용해야합니다. 현대 컴퓨터에서 프로세스를 만들고 스레드를 만드는 데는 거의 같은 비용이 듭니다. – Yves
스레드를 생성하는 것은 프로세스를 만드는 것과 비슷한 비용을 가질 수 있지만 스레드 간 통신은 프로세스간에 통신하는 데 비용이 많이 듭니다. (아마도 공유 메모리를 사용하지 않는 한). 또한 GIL에 대한 귀하의 의견은 부분적으로 만 사실입니다. I/O 작업 중 및 CPU 바인딩 작업 중에도 일부 라이브러리 (예 : numpy)에서 릴리스됩니다. 여전히 GIL은 궁극적으로 파이썬에서 별도의 프로세스를 사용하는 이유입니다. –