Value
thực sự có thể thay đổi được; bạn chỉ định kiểu dữ liệu bạn muốn từ mô-đun ctypes
và sau đó nó có thể bị biến đổi. Dưới đây là một hoàn thành, làm việc kịch bản đó chứng tỏ điều này:
from time import sleep
from ctypes import c_int
from multiprocessing import Value, Lock, Process
counter = Value(c_int) # defaults to 0
counter_lock = Lock()
def increment():
with counter_lock:
counter.value += 1
def do_something():
print("I'm a separate process!")
increment()
Process(target=do_something).start()
sleep(1)
print counter.value # prints 1, because Value is shared and mutable
EDIT: Luper một cách chính xác chỉ ra trong một chú thích bên dưới mà Value
giá trị được khóa theo mặc định. Điều này đúng theo nghĩa là ngay cả khi một phép gán bao gồm nhiều phép toán (như gán một chuỗi có thể có nhiều ký tự) thì phép gán này là nguyên tử. Tuy nhiên, khi tăng bộ đếm, bạn vẫn sẽ cần khóa ngoài như được cung cấp trong ví dụ của tôi, bởi vì tăng tải trọng giá trị hiện tại và sau đó tăng giá trị và sau đó gán kết quả trở lại Value
.
Vì vậy mà không có một khóa bên ngoài, bạn có thể gặp phải tình huống sau đây:
- Process 1 lần đọc (nguyên tử) giá trị hiện tại của bộ đếm, sau đó tăng nó
- trước Process 1 có thể gán tăng lên truy cập trở lại
Value
, một chuyển ngữ cảnh occurrs
- Process 2 lần đọc (nguyên tử) của (unincremented) giá trị hiện tại của bộ đếm, increments nó, và gán kết quả tăng lên (nguyên tử) trở lại
Value
- Quy trình 1 chỉ định giá trị tăng dần của nó (nguyên tử), thổi đi sự gia tăng được thực hiện bởi Quy trình 2
Nguồn
2009-08-05 13:46:06
Truy cập giá trị được bảo vệ bằng Khóa theo mặc định. –
Bạn cần "từ __future__ nhập with_statement" ở đây, phải không? –
@Edward: Bạn cần nhập khẩu trong tương lai nếu bạn đang sử dụng Python 2.5, tôi đã sử dụng Python 2.6 khi tôi viết mã đó, vì vậy nó không cần thiết. –