Tôi chưa thấy các ví dụ rõ ràng với các trường hợp sử dụng cho Pool.apply, Pool.apply_async và Pool.map. Tôi chủ yếu sử dụng Pool.map
; lợi thế của người khác là gì?multiprocessing.Pool: Khi nào cần sử dụng, apply_async hoặc map?
Trả lời
Trở lại trong những ngày cũ của Python, để gọi một hàm với đối số tùy ý, bạn sẽ sử dụng apply
:
apply(f,args,kwargs)
apply
vẫn còn tồn tại trong Python2.7 mặc dù không phải trong Python3, và thường không được sử dụng nữa . Ngày nay,
f(*args,**kwargs)
được ưu tiên. Các mô-đun multiprocessing.Pool
cố gắng cung cấp một giao diện tương tự.
Pool.apply
giống như Python apply
, ngoại trừ việc gọi hàm được thực hiện trong một quy trình riêng biệt. Pool.apply
khối cho đến khi chức năng được hoàn thành.
Pool.apply_async
cũng giống như tích hợp sẵn của Python apply
, ngoại trừ việc cuộc gọi trả về ngay lập tức thay vì chờ kết quả. Một đối tượng ApplyResult
được trả về. Bạn gọi phương thức get()
để truy xuất kết quả của cuộc gọi hàm. Các khối phương thức get()
cho đến khi chức năng được hoàn thành. Do đó, pool.apply(func, args, kwargs)
tương đương với pool.apply_async(func, args, kwargs).get()
.
Ngược lại với Pool.apply
, phương pháp Pool.apply_async
cũng có gọi lại, nếu được cung cấp, được gọi khi chức năng hoàn tất. Điều này có thể được sử dụng thay vì gọi số get()
.
Ví dụ:
import multiprocessing as mp
import time
def foo_pool(x):
time.sleep(2)
return x*x
result_list = []
def log_result(result):
# This is called whenever foo_pool(i) returns a result.
# result_list is modified only by the main process, not the pool workers.
result_list.append(result)
def apply_async_with_callback():
pool = mp.Pool()
for i in range(10):
pool.apply_async(foo_pool, args = (i,), callback = log_result)
pool.close()
pool.join()
print(result_list)
if __name__ == '__main__':
apply_async_with_callback()
có thể mang lại một kết quả như
[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]
Chú ý, không giống như pool.map
, thứ tự của các kết quả có thể không tương ứng với thứ tự mà các pool.apply_async
cuộc gọi đã được thực hiện .
Vì vậy, nếu bạn cần phải chạy một hàm trong một quá trình riêng biệt, nhưng muốn quá trình hiện tại để khối cho đến khi trở về chức năng, sử dụng Pool.apply
. Giống như Pool.apply
, Pool.map
khối cho đến khi kết quả hoàn tất được trả lại.
Nếu bạn muốn Nhóm công việc của quy trình thực hiện nhiều cuộc gọi chức năng không đồng bộ, hãy sử dụng Pool.apply_async
. Yêu cầu của kết quả không được đảm bảo giống như thứ tự của các cuộc gọi đến Pool.apply_async
.
Cũng lưu ý rằng bạn có thể gọi một số các chức năng khác nhau với Pool.apply_async
(không phải tất cả các cuộc gọi đều cần sử dụng cùng chức năng).
Ngược lại, Pool.map
áp dụng cùng chức năng cho nhiều đối số. Tuy nhiên, không giống như Pool.apply_async
, kết quả được trả về theo thứ tự tương ứng với thứ tự của các đối số.
Về apply
vs map
:
pool.apply(f, args)
: f
chỉ được thực hiện tại một trong những công nhân của hồ bơi. Vì vậy, MỘT trong các quy trình trong hồ bơi sẽ chạy f(args)
.
pool.map(f, iterable)
: Phương pháp này cho phép lặp lại thành một số đoạn mà nó gửi đến nhóm xử lý dưới dạng các tác vụ riêng biệt. Vì vậy, bạn tận dụng tất cả các quy trình trong hồ bơi.
nếu máy lặp lại là máy phát điện –
Hmm ... Câu hỏi hay. Thành thật mà nói tôi chưa bao giờ sử dụng hồ bơi với máy phát điện, nhưng thread này có thể hữu ích: https://stackoverflow.com/questions/5318936/python-multiprocessing-pool-lazy-iteration – kakhkAtion
@kakhkAtion Về việc áp dụng, nếu chỉ có một của những người lao động thực thi chức năng, những người làm công việc còn lại làm gì? Tôi có phải gọi áp dụng nhiều lần để phần còn lại của công nhân thực hiện một nhiệm vụ không? – Moondra
- 1. Quy trình hoặc quy trình apply_async có cần thiết không?
- 2. Gọi lại cho cần tây apply_async
- 3. zmq - khi nào cần sử dụng zmq_bind hoặc zmq_connect
- 4. Bộ nhớ sử dụng tiếp tục phát triển với multiprocessing.pool Python của
- 5. python multiprocessing apply_async chỉ sử dụng một quy trình
- 6. Khi nào tôi cần sử dụng MPI_Barrier()?
- 7. Khi nào tôi cần sử dụng quaternions?
- 8. Khi nào tôi cần sử dụng @WebServiceRef?
- 9. Khi nào cần sử dụng Eventstore
- 10. Có giá trị khi sử dụng map() vs cho không?
- 11. Khi nào cần sử dụng singleTop launchMode trong một widget hoặc ứng dụng Android?
- 12. Khi nào sử dụng undef_method, và khi nào cần sử dụng remove_method?
- 13. Khi nào cần sử dụng viewDidLoad và khi nào thì sử dụng awakeFromNib
- 14. Khi nào cần sử dụng giao diện và khi nào cần sử dụng các chức năng bậc cao hơn?
- 15. Khi nào sử dụng Servlet hoặc @Controller
- 16. Khi nào cần sử dụng Request.UrlReferrer và khi Request.ServerVariables ["HTTP_REFERER"]?
- 17. Khi nào sử dụng NaN hoặc +/- Infinity?
- 18. Khi nào cần sử dụng socket.io và khi nào thì sử dụng ajax
- 19. Khi nào sử dụng giao diện hoặc lớp trừu tượng? Khi nào sử dụng cả hai?
- 20. Khi nào cần sử dụng con trỏ void?
- 21. Khi nào cần sử dụng công cụ xây dựng?
- 22. Sử dụng lớp << tự, khi nào cần sử dụng các lớp học hoặc mô-đun?
- 23. Khi nào cần sử dụng Xe buýt sự kiện?
- 24. Haskell: không thể sử dụng "map putStrLn"?
- 25. Khi nào cần sử dụng Ống vs Khi sử dụng Bộ nhớ Chia sẻ
- 26. sử dụng BOOST_FOREACH với std :: map
- 27. Khi nào cần sử dụng đồng bộ trong Java
- 28. Khi nào cần sử dụng Giao dịch trong SQL Server
- 29. __declspec là gì và khi nào tôi cần sử dụng?
- 30. Khi nào tôi cần sử dụng _.bindAll() trong Backbone.js?
Nếu có 'if __name __ ==" __ chính __ "' trước 'apply_async_with_callback()' trên Windows? – jfs
Có, cảm ơn lời nhắc. – unutbu
Cảm ơn rất nhiều. làm thế nào về map_async? –