Vì một số lý do, tôi không thể tìm thấy một ví dụ chung về cách thực hiện việc này với Show
Cập nhật cho những người được định hướng đối tượng (được thử nghiệm trong Python 3.4): for those who are object-oriented (tested in Python 3.4): Tờ Cheat API mô -đun đa xử lýreturn a variable from a child process using a multiprocessing.Value or a multiprocessing.Queue. Trong hướng dẫn này, bạn sẽ khám phá cách trả về một giá trị từ một quy trình trong Python.return a value from a process in Python. Bắt đầu nào.
Một quy trình là một thể hiện đang chạy của một chương trình máy tính. Mỗi chương trình Python được thực hiện trong một quy trình, đây là một ví dụ mới của trình thông dịch Python. Quá trình này có tên chính và có một luồng được sử dụng để thực hiện các hướng dẫn chương trình được gọi là chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản. Đôi khi chúng ta có thể cần tạo các quy trình con mới trong chương trình của mình để thực thi mã đồng thời. Python cung cấp khả năng tạo và quản lý các quy trình mới thông qua lớp đa xử lý.multiprocessing.Process class. Trong chương trình đa xử lý, chúng ta thường cần trả về một giá trị từ một quy trình. Đây là một thách thức vì không có phương pháp trực tiếp để trả lại giá trị từ quy trình sang quy trình gọi khác. Làm thế nào chúng ta có thể trả lại một giá trị từ một quá trình? Cách trả lại giá trị từ một quá trìnhTrả về biến từ quy trình với giá trị Trả về biến từ quá trình với đường ống Trả về biến từ quy trình với hàng đợi
Đọc thêm
Đôi khi chúng ta có thể cần tạo các quy trình con mới trong chương trình của mình để thực thi mã đồng thời. Python cung cấp khả năng tạo và quản lý các quy trình mới thông qua lớp đa xử lý. Trả về biến từ quy trình với giá trịTrả về biến từ quá trình với đường ốngmultiprocessing.Value object. Trả về biến từ quy trình với hàng đợi Ví dụ về việc trả về một biến thông qua một giá trị Ví dụ về việc trả lại một biến thông qua một đường ốngmultiprocessing.Value can be defined in the constructor of a custom class as a shared instance variable. Ví dụ về việc trả về một biến thông qua hàng đợimultiprocessing.Value class requires that we specify the data type and an initial value. Đọc thêmtype” or a typecode. Takeaways
Mỗi chương trình Python được thực hiện trong một quy trình, đây là một ví dụ mới của trình thông dịch Python. Quá trình này có tên chính và có một luồng được sử dụng để thực hiện các hướng dẫn chương trình được gọi là chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản. Đôi khi chúng ta có thể cần tạo các quy trình con mới trong chương trình của mình để thực thi mã đồng thời.
Trong chương trình đa xử lý, chúng ta thường cần trả về một giá trị từ một quy trình.
Không có phương pháp trực tiếp để trả về một giá trị từ một quá trình. Thay vào đó, nó có thể đạt được bằng các phương pháp gián tiếp.value” attribute. Có một số phương pháp gián tiếp để lựa chọn. Ba phương thức thuận tiện và được sử dụng rộng rãi nhất để trả về giá trị từ một quy trình như sau:
Không có phương pháp trực tiếp để trả về một giá trị từ một quá trình.value” attribute. Có một số phương pháp gián tiếp để lựa chọn. Ba phương thức thuận tiện và được sử dụng rộng rãi nhất để trả về giá trị từ một quy trình như sau:
Không có phương pháp trực tiếp để trả về một giá trị từ một quá trình. Trả về biến từ quá trình với đường ốngThay vào đó, nó có thể đạt được bằng các phương pháp gián tiếp.multiprocessing.Pipe class. Có một số phương pháp gián tiếp để lựa chọn. Ba phương thức thuận tiện và được sử dụng rộng rãi nhất để trả về giá trị từ một quy trình như sau: Sử dụng một đối tượng đa xử lý.value. Sử dụng một đối tượng đa xử lý.pipe.multiprocessing.connection.Connection class. Sử dụng một đối tượng đa xử lý.queue.multiprocessing.Pipe class, which returns two multiprocessing.connection.Connection objects. Có một số phương pháp gián tiếp để lựa chọn. Ba phương thức thuận tiện và được sử dụng rộng rãi nhất để trả về giá trị từ một quy trình như sau:
Không có phương pháp trực tiếp để trả về một giá trị từ một quá trình. Các đối tượng có thể được chia sẻ giữa các quá trình sử dụng đường ống. Hàm Connection.Send () có thể được sử dụng để gửi các đối tượng từ quy trình này sang quy trình khác.Connection.send() function can be used to send objects from one process to another. Các đối tượng được gửi phải được chọn. Ví dụ:
Hàm Connection.recv () có thể được sử dụng để nhận các đối tượng trong một quy trình được gửi bởi một quy trình khác.Connection.recv() function can be used to receive objects in one process sent by another. Các đối tượng nhận được sẽ tự động không bị ảnh hưởng. Ví dụ:
Conn2.Send ('Hello World') Hàm Connection.recv () có thể được sử dụng để nhận các đối tượng trong một quy trình được gửi bởi một quy trình khác.
# Nhận một đối tượngCuộc gọi chức năng sẽ chặn cho đến khi nhận được một đối tượng.multiprocessing.Queue class. Bạn có thể tìm hiểu thêm về các đường ống giữa các quy trình trong hướng dẫn:put() and from which items can be retrieved by a call to get(). Ống đa xử lý trong Pythonmultiprocessing.Queue provides a first-in, first-out FIFO queue, which means that the items are retrieved from the queue in the order they were added. The first items added to the queue will be the first items retrieved. This is opposed to other queue types such as last-in, first-out and priority queues. Trả về biến từ quy trình với hàng đợimultiprocessing.Queue can be used by first creating an instance of the class. This will create an unbounded queue by default, that is, a queue with no size limit. Ví dụ:
Conn2.Send ('Hello World')put(), for example:
Conn2.Send ('Hello World')put() will block and will not use a timeout. Hàm Connection.recv () có thể được sử dụng để nhận các đối tượng trong một quy trình được gửi bởi một quy trình khác.get(). Ví dụ:
Conn2.Send ('Hello World')get() will block until an item is available to retrieve from the queue and will not use a timeout. Hàm Connection.recv () có thể được sử dụng để nhận các đối tượng trong một quy trình được gửi bởi một quy trình khác.
# Nhận một đối tượng Cuộc gọi chức năng sẽ chặn cho đến khi nhận được một đối tượng. Bạn có thể tìm hiểu thêm về các đường ống giữa các quy trình trong hướng dẫn:Ống đa xử lý trong Pythonmultiprocessing.Value. Trả về biến từ quy trình với hàng đợiValue object, then create a new child process that will execute a custom function. The function will generate a random value and store it in the value. This value will then be “returned” to the parent process. Specifically, the parent process will access the shared value set by the child process. Chúng ta có thể trả về một biến từ một quy trình bằng cách sử dụng lớp đa xử lý.queue. Hàng đợi là một cấu trúc dữ liệu mà các mục có thể được thêm vào bằng một cuộc gọi để đặt () và từ đó các mục có thể được truy xuất bằng cách gọi để nhận ().task() and it will take a shared multiprocessing.Value instance as an argument
Các mục có thể được thêm vào hàng đợi thông qua một cuộc gọi để đặt (), ví dụ:random.random() function.
Theo mặc định, cuộc gọi để đặt () sẽ chặn và sẽ không sử dụng thời gian chờ.
Theo mặc định, cuộc gọi để nhận () sẽ chặn cho đến khi một mục có sẵn để truy xuất từ hàng đợi và sẽ không sử dụng thời gian chờ. Bạn có thể tìm hiểu thêm về hàng đợi đa xử lý trong hướng dẫn:
Bây giờ chúng ta đã biết cách trả về một biến từ một quy trình, hãy để xem xét một số ví dụ đã làm việc.task() function is listed below.
Các mục có thể được lấy từ hàng đợi bằng cách gọi để nhận ().multiprocessing.Value instance. # Nhận một mục từ hàng đợi
Bạn có thể tìm hiểu thêm về hàng đợi đa xử lý trong hướng dẫn:multiprocessing.Process instance and configure it to execute our task() function and pass the shared variable instance as an argument.
Bây giờ chúng ta đã biết cách trả về một biến từ một quy trình, hãy để xem xét một số ví dụ đã làm việc.
Ví dụ về việc trả về một biến thông qua một giá trịjoin() function.
Nếu bạn chưa quen với việc tham gia một quy trình trẻ em, hãy xem hướng dẫn:
Cuối cùng, quy trình mẹ sẽ truy cập giá trị return return mô phỏng từ quy trình con thông qua phiên bản đa xử lý được chia sẻ.return” value from the child process via the shared multiprocessing.Value instance.
Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.
Chạy ví dụ đầu tiên tạo ra phiên bản đa xử lý được chia sẻ.multiprocessing.Value instance. Quá trình con được cấu hình và bắt đầu và các khối quy trình chính cho đến khi quá trình con kết thúc. Quá trình con tạo ra một giá trị ngẫu nhiên và các khối trong một khoảnh khắc. Sau đó, nó lưu trữ giá trị được tạo trong thể hiện giá trị được chia sẻ để quy trình cha mẹ truy cập. Quá trình con kết thúc và quá trình chính bỏ chặn. Quá trình cha mẹ sau đó báo cáo số được lưu trữ trong thể hiện giá trị được chia sẻ, mô phỏng giá trị trả về.Value instance, simulating a return value. Chúng ta có thể thấy rằng giá trị được tạo trong quy trình con phù hợp với giá trị được truy cập bởi quy trình cha mẹ, cho thấy rằng lợi nhuận mô phỏng hoạt động như mong đợi. Lưu ý, kết quả cụ thể của bạn sẽ khác nhau khi sử dụng các số ngẫu nhiên.
Khóa học đa xử lý Python miễn phí Đăng ký khóa học email 7 ngày miễn phí của tôi. Khám phá cách sử dụng mô -đun đa xử lý Python, bao gồm cách tạo và bắt đầu các quá trình con, cách sử dụng mutex và semaphore, và nhiều hơn nữa! Nhấp vào nút bên dưới và nhập địa chỉ email của bạn để đăng ký và nhận bài học đầu tiên ngay bây giờ. Bắt đầu khóa học email miễn phí của bạn ngay bây giờ! & NBSP; Ví dụ về việc trả lại một biến thông qua một đường ốngChúng ta có thể mô phỏng trả về một biến từ một quá trình bằng cách sử dụng đa xử lý.pipe.multiprocessing.Pipe. Trong ví dụ này, chúng tôi sẽ tạo một đường ống sẽ tạo hai đối tượng kết nối. Một đối tượng kết nối sẽ được chuyển đến quy trình con và một đối tượng sẽ được giữ bởi quy trình cha. Quá trình con sẽ thực hiện công việc của mình và gửi kết quả của nó đến quy trình cha mẹ thông qua đối tượng kết nối đường ống. Đầu tiên, chúng ta có thể xác định một chức năng để thực thi trong một quy trình trẻ em. Hàm sẽ lấy một đối tượng kết nối làm đối số, tạo giá trị ngẫu nhiên trong khoảng từ 0 đến 1, báo cáo nó, chặn cho một phần giây để mô phỏng công việc và sau đó gửi kết quả qua đối tượng kết nối. Hàm nhiệm vụ () bên dưới thực hiện điều này.task() function below implements this.
# Bảo vệ điểm vàomultiprocessing.Pipe which return two connection objects. & nbsp; & nbsp; & nbsp; & nbsp;# tạo biến được chia sẻ
& nbsp; & nbsp; & nbsp; & nbsp;# bắt đầu quá trìnhmultiprocessing.Process instance to execute our task() function and pass it the connection object for sending. Then the child process can then be started.
& nbsp; & nbsp; & nbsp; & nbsp; print (f'returned: {varable.value} ')recv() function on the connection and wait for a result to be “returned” or sent from the child process.
Sau khi nhận được, kết quả có thể được báo cáo để xác nhận nó phù hợp với giá trị được tạo ra.
Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.
Chạy ví dụ đầu tiên tạo đường ống, trả về hai đối tượng kết nối. Quá trình con sau đó được cấu hình và bắt đầu. Quá trình cha mẹ sau đó chặn, chờ đợi trên đường ống để kết quả được gửi bởi quy trình con. Quá trình con tạo ra một số, báo cáo nó, sau đó gửi nó đến quy trình cha mẹ thông qua đường ống. Quá trình cha mẹ nhận được giá trị, sau đó báo cáo nó. Chúng ta có thể thấy rằng giá trị được báo cáo bởi quy trình cha phù hợp với giá trị được tạo ra bởi quá trình con. Lưu ý, kết quả cụ thể của bạn sẽ khác nhau khi sử dụng các số ngẫu nhiên.
Ví dụ về việc trả về một biến thông qua hàng đợiChúng ta có thể mô phỏng trả về một biến từ một quá trình bằng cách sử dụng đa xử lý.queue.multiprocessing.Queue. Trong ví dụ này, chúng tôi sẽ tạo một hàng đợi sẽ được chia sẻ giữa hai quy trình. Quá trình trẻ em sẽ chuẩn bị một số dữ liệu và đặt nó vào hàng đợi được chia sẻ. Quá trình cha mẹ sẽ chặn và chờ dữ liệu đến hàng đợi từ quy trình con. Đầu tiên, chúng ta có thể xác định một chức năng để thực thi trong một quy trình trẻ em. Hàm sẽ lấy đối tượng hàng đợi được chia sẻ làm đối số, tạo giá trị ngẫu nhiên trong khoảng từ 0 đến 1, báo cáo nó, chặn cho một phần giây để mô phỏng công việc và sau đó đặt kết quả lên hàng đợi. Hàm nhiệm vụ () bên dưới thực hiện điều này.task() function below implements this.
# Bảo vệ điểm vàomultiprocessing.Queue which will be shared between the processes.
& nbsp; & nbsp; & nbsp; & nbsp;# tạo một quy trình conmultiprocessing.Process instance to execute our task() function and pass it the shared Queue object. Then the child process can then be started.
& nbsp; & nbsp; & nbsp; & nbsp;# Báo cáo giá trị trả vềget() function on the Queue and wait for a result to be “returned” or sent from the child process.
Sau khi nhận được, kết quả có thể được báo cáo để xác nhận nó phù hợp với giá trị được tạo ra.
Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.
Chạy ví dụ đầu tiên tạo ra hàng đợi được chia sẻ.Queue. Quá trình con sau đó được cấu hình và bắt đầu. Quá trình cha mẹ sau đó chặn, chờ đợi trong hàng đợi để kết quả đến. Quá trình con tạo ra một số, báo cáo nó, sau đó đặt nó lên hàng đợi để mô phỏng trả về một giá trị. Quá trình cha mẹ lấy một giá trị từ hàng đợi và sau đó báo cáo nó. Chúng ta có thể thấy rằng giá trị được báo cáo bởi quy trình cha phù hợp với giá trị được tạo ra bởi quá trình con. Lưu ý, kết quả cụ thể của bạn sẽ khác nhau khi sử dụng các số ngẫu nhiên.
Đọc thêmPhần này cung cấp các tài nguyên bổ sung mà bạn có thể thấy hữu ích.
TakeawaysBây giờ bạn biết cách trả về một giá trị từ một quá trình. Bạn có câu hỏi nào không? Đặt câu hỏi của bạn trong các ý kiến dưới đây và tôi sẽ cố gắng hết sức để trả lời. Ảnh của Sean Chen trên unplash Làm thế nào để bạn trả về một giá trị từ một nhóm đa xử lý trong Python?Bạn có thể trả về một biến từ một quy trình con bằng cách sử dụng đa xử lý ... Đối tượng giá trị .. Đối tượng ống .. Đối tượng hàng đợi .. Bản đồ đa xử lý trở lại là gì?Sau đó, chúng ta có thể gọi hàm map () trên nhóm quy trình để áp dụng hàm nhiệm vụ () của chúng ta cho từng giá trị trong một phạm vi từ 0 đến 1. Điều này trả về một trình lặp lại qua kết quả được trả về từ hàm Tác vụ (), theo thứ tự màCác cuộc gọi chức năng được hoàn thành.an iterator over the results returned from the task() function, in the order that function calls are completed.
Nhóm đa xử lý làm gì trong Python?Nhóm đa xử lý Python có thể được sử dụng để thực hiện song song một hàm trên nhiều giá trị đầu vào, phân phối dữ liệu đầu vào trên các quy trình (song song dữ liệu).parallel execution of a function across multiple input values, distributing the input data across processes (data parallelism).
Làm thế nào để bạn vượt qua nhiều đối số trong đa xử lý Python?Sử dụng hồ bơi.Hàm đa bộ xử lý starmap () sẽ gọi hàm đích với nhiều đối số.Như vậy, nó có thể được sử dụng thay vì hàm map ().Đây có lẽ là cách tiếp cận ưa thích để thực hiện chức năng đích trong nhóm đa xử lý có nhiều đối số..
The multiprocessing pool starmap() function will call the target function with multiple arguments. As such it can be used instead of the map() function. This is probably the preferred approach for executing a target function in the multiprocessing pool that takes multiple arguments. |