Khi bạn sử dụng Value
bạn nhận được một đối tượng ctypes
trong bộ nhớ chia sẻ rằng theo mặc định được đồng bộ sử dụng RLock
. Khi bạn sử dụng Manager
, bạn sẽ nhận được đối tượng SynManager
kiểm soát quy trình máy chủ cho phép các giá trị đối tượng bị thao tác bởi các quy trình khác. Bạn có thể tạo nhiều proxy bằng cùng một người quản lý; không có nhu cầu để tạo ra một người quản lý mới trong vòng lặp của bạn:
manager = Manager()
for i in range(5):
new_value = manager.Value('i', 0)
Các Manager
có thể được chia sẻ trên máy tính, trong khi Value
được giới hạn trong một máy tính. Value
sẽ nhanh hơn (chạy mã bên dưới để xem), vì vậy tôi nghĩ bạn nên sử dụng điều đó trừ khi bạn cần hỗ trợ các đối tượng tùy ý hoặc truy cập chúng qua mạng.
import time
from multiprocessing import Process, Manager, Value
def foo(data, name=''):
print type(data), data.value, name
data.value += 1
if __name__ == "__main__":
manager = Manager()
x = manager.Value('i', 0)
y = Value('i', 0)
for i in range(5):
Process(target=foo, args=(x, 'x')).start()
Process(target=foo, args=(y, 'y')).start()
print 'Before waiting: '
print 'x = {0}'.format(x.value)
print 'y = {0}'.format(y.value)
time.sleep(5.0)
print 'After waiting: '
print 'x = {0}'.format(x.value)
print 'y = {0}'.format(y.value)
Để tóm tắt:
- Sử dụng
Manager
để tạo ra nhiều đối tượng chia sẻ, bao gồm dicts và danh sách. Sử dụng Manager
để chia sẻ dữ liệu giữa các máy tính trên mạng.
- Sử dụng
Value
hoặc Array
khi không cần chia sẻ thông tin trên mạng và các loại trong ctypes
là đủ cho nhu cầu của bạn.
Value
nhanh hơn Manager
.
Warning
Bằng cách này, chia sẻ dữ liệu qua các quy trình/đề nên tránh nếu có thể. Đoạn mã trên có thể chạy như mong đợi, nhưng tăng thời gian để thực hiện foo
và mọi thứ sẽ trở nên kỳ lạ. So sánh các bên trên với:
def foo(data, name=''):
print type(data), data.value, name
for j in range(1000):
data.value += 1
Bạn cần có Lock
để làm việc này hoạt động chính xác.
Tôi không đặc biệt am hiểu về tất cả những điều này, vì vậy có thể một người khác sẽ đến và cung cấp thông tin chi tiết hơn. Tôi nghĩ tôi sẽ đóng góp một câu trả lời vì câu hỏi đó không được chú ý. Hy vọng rằng sẽ giúp một chút.
Có liên quan: http://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing –