2009-08-05 39 views
9

Xin chào mọi người, tôi đang sử dụng đa xử lý trong python ngay bây giờ. và tôi chỉ tự hỏi liệu có tồn tại một loại biến số truy cập đơn giản nào đó mà mỗi quá trình khi chúng được thực hiện xử lý một số nhiệm vụ có thể chỉ tăng (loại giống như bao nhiêu công việc làm trong tổng số).Python đa xử lý dễ dàng để thực hiện một bộ đếm đơn giản?

Tôi đã tra cứu API cho Giá trị, không nghĩ rằng nó có thể thay đổi.

Trả lời

23

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
+2

Truy cập giá trị được bảo vệ bằng Khóa theo mặc định. –

+0

Bạn cần "từ __future__ nhập with_statement" ở đây, phải không? –

+0

@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. –

Các vấn đề liên quan