Sự khác biệt giữa ThreadPool
và Pool
trong mô hình multiprocessing
là gì. Khi tôi cố gắng mã của tôi ra, đây là sự khác biệt chính tôi thấy:Sự khác biệt giữa ThreadPool vs Pool trong mô-đun đa xử lý Python
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)
tôi nhìn thấy đầu ra sau đây:
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]
Với "ThreadPool":
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)
tôi thấy sản lượng sau:
hi outside of main()
inside hello()
inside hello()
Proccess id: 15204
Proccess id: 15204
inside hello()
Proccess id: 15204
[0, 1, 4]
Ques của tôi tions là:
tại sao "bên ngoài __main __()" chạy mỗi lần trong
Pool
?multiprocessing.pool.ThreadPool
không sinh ra các quy trình mới? Nó chỉ tạo ra các chủ đề mới?Nếu có sự khác biệt nào giữa việc sử dụng
multiprocessing.pool.ThreadPool
thay vì chỉ mô-đunthreading
?
Tôi không thấy bất kỳ tài liệu chính thức nào cho ThreadPool
ở bất kỳ đâu, ai đó có thể giúp tôi tìm nơi tôi có thể tìm thấy?
Như tôi biết, vì GIL trong Python, sự đa luồng của Python trông giống như đa luồng nhưng nó không thực. Nếu bạn muốn tận dụng lợi thế của đa lõi của bạn với python, bạn cần phải sử dụng đa xử lý. Trong máy tính hiện đại, việc tạo ra một quy trình và tạo ra một luồng có cùng mức chi phí. – Yves
Tạo chuỗi có thể có chi phí tương tự để tạo quy trình, nhưng việc liên lạc giữa các luồng có chi phí rất khác nhau để giao tiếp giữa các quy trình (trừ khi có thể bạn đã sử dụng bộ nhớ dùng chung). Ngoài ra, nhận xét của bạn về GIL chỉ là một phần đúng: nó được phát hành trong các hoạt động I/O và bởi một số thư viện (ví dụ: numpy) ngay cả trong các hoạt động liên kết CPU. Tuy nhiên, GIL cuối cùng là lý do để sử dụng các quy trình riêng biệt trong Python. –