Hướng dẫn how do you return a value from a multiprocessing pool in python? - làm thế nào để bạn trả về một giá trị từ một nhóm đa xử lý trong python?

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 Queue ở bất cứ đâu (ngay cả các ví dụ tài liệu của Python cũng không sinh ra nhiều quy trình), vì vậy đây là những gì tôi đã làm việc sau 10 lần thử:

def add_helper(queue, arg1, arg2): # the func called in child processes
    ret = arg1 + arg2
    queue.put(ret)

def multi_add(): # spawns child processes
    q = Queue()
    processes = []
    rets = []
    for _ in range(0, 100):
        p = Process(target=add_helper, args=(q, 1, 2))
        processes.append(p)
        p.start()
    for p in processes:
        ret = q.get() # will block
        rets.append(ret)
    for p in processes:
        p.join()
    return rets

Queue là một hàng đợi an toàn, an toàn luồng mà bạn có thể sử dụng để lưu trữ các giá trị trả về từ các quy trình con. Vì vậy, bạn phải chuyển hàng đợi cho mỗi quá trình. Một cái gì đó ít rõ ràng hơn ở đây là bạn phải get() từ hàng đợi trước khi bạn join Processes nếu không thì hàng đợi lấp đầy và chặn mọi thứ.

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):

from multiprocessing import Process, Queue

class Multiprocessor():

    def __init__(self):
        self.processes = []
        self.queue = Queue()

    @staticmethod
    def _wrapper(func, queue, args, kwargs):
        ret = func(*args, **kwargs)
        queue.put(ret)

    def run(self, func, *args, **kwargs):
        args2 = [func, self.queue, args, kwargs]
        p = Process(target=self._wrapper, args=args2)
        self.processes.append(p)
        p.start()

    def wait(self):
        rets = []
        for p in self.processes:
            ret = self.queue.get()
            rets.append(ret)
        for p in self.processes:
            p.join()
        return rets

# tester
if __name__ == "__main__":
    mp = Multiprocessor()
    num_proc = 64
    for _ in range(num_proc): # queue up multiple tasks running `sum`
        mp.run(sum, [1, 2, 3, 4, 5])
    ret = mp.wait() # get all results
    print(ret)
    assert len(ret) == num_proc and all(r == 15 for r in ret)

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ý.value hoặc đa xử lý.queue.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.

  • Cần trả lại giá trị từ quá trình
  • Cách trả lại giá trị từ một quá trình
    • Trả 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
  • 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 ống
  • Ví dụ về việc trả về một biến thông qua hàng đợi
  • Đọc thêm
  • Takeaways

Bâ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.

Đô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ì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.

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.multiprocessing.Value object.
  • Sử dụng một đối tượng đa xử lý.pipe.multiprocessing.Pipe object.
  • Sử dụng một đối tượng đa xử lý.queue.multiprocessing.Queue object.

Các cách tiếp cận khác có thể bao gồm:

  • Sử dụng đa xử lý.Manager, ví dụ: Các quá trình tương tác với cùng một đối tượng thông qua proxy.multiprocessing.Manager, e.g. processes interact with the same object via proxies.
  • Sử dụng đa xử lý.SharedCtypes, ví dụ: Các phương pháp tương tự làm nền tảng cho đa xử lý.value.multiprocessing.sharedctypes, e.g. same methods that underlie multiprocessing.Value.
  • Sử dụng đa xử lý.shared_memory.multiprocessing.shared_memory.

Bạn có biết bất kỳ phương pháp nào khác không? Hãy cho tôi biết trong các ý kiến ​​dưới đây.
Let me know in the comments below.

Tiếp theo, hãy để xem xét kỹ hơn một số phương pháp này.

Trả về biến từ quy trình với giá trị

Chúng ta có thể trả về một biến từ một quy trình bằng cách sử dụng đối tượng đa xử lý.multiprocessing.Value object.

Các lớp này xác định rõ ràng các thuộc tính dữ liệu được thiết kế để chia sẻ giữa các quy trình theo cách an toàn quá trình.

Cách an toàn quá trình có nghĩa là chỉ có một quy trình có thể đọc hoặc truy cập biến tại một thời điểm. Các biến được chia sẻ có nghĩa là những thay đổi được thực hiện trong một quá trình luôn được truyền bá và cung cấp cho các quy trình khác.

Một thể hiện của đa xử lý.value có thể được xác định trong hàm tạo của một lớp tùy chỉnh dưới dạng biến thể hiện được chia sẻ.multiprocessing.Value can be defined in the constructor of a custom class as a shared instance variable.

Chất xây dựng của lớp Đa xử lý. Yêu cầu chúng tôi chỉ định loại dữ liệu và giá trị ban đầu.multiprocessing.Value class requires that we specify the data type and an initial value.

Kiểu dữ liệu có thể được chỉ định bằng cách sử dụng CTYPE loại loại hoặc một kiểu chữ.type” or a typecode.

Bạn có thể tìm hiểu thêm về CTYPES tại đây:

  • CTYPES - Một thư viện chức năng nước ngoài cho Python

Typecodes rất quen thuộc và dễ sử dụng, ví dụ ‘I, cho một số nguyên đã ký hoặc‘ f, cho một giá trị dấu phẩy động duy nhất.

Bạn có thể thấy một bảng mã loại tiện dụng tại đây:

  • Mảng - Mảng hiệu quả của các giá trị số

Ví dụ: chúng ta có thể xác định một biến bộ nhớ được chia sẻ giá trị chứa một số nguyên đã ký và được khởi tạo theo giá trị 0.

.....

# Khởi tạo một biến được chia sẻ số nguyên

data=multiprocessing.Value('i',0)=multiprocessing.Value('i',0)

Biến này sau đó có thể được khởi tạo trong quy trình cha và được chia sẻ với quy trình con

Chúng ta có thể thay đổi giá trị của biến dữ liệu được chia sẻ thông qua thuộc tính giá trị của Cameron.value” attribute.

Ví dụ:

.....

# Khởi tạo một biến được chia sẻ số nguyên

data.value=100.value=100

Biến này sau đó có thể được khởi tạo trong quy trình cha và được chia sẻ với quy trình convalue” attribute.

Ví dụ:

.....

# Khởi tạo một biến được chia sẻ số nguyên

value=data.value=data.value

Biến này sau đó có thể được khởi tạo trong quy trình cha và được chia sẻ với quy trình con

Chúng ta có thể thay đổi giá trị của biến dữ liệu được chia sẻ thông qua thuộc tính giá trị của Cameron.

Ví dụ:multiprocessing.Pipe class.

# Thay đổi giá trị của biến được chia sẻ

Chúng ta có thể truy cập giá trị của biến dữ liệu được chia sẻ thông qua cùng một thuộc tính giá trị trên mạng.

# Truy cập biến được chia sẻmultiprocessing.connection.Connection class.

Việc truyền bá các thay đổi đối với biến được chia sẻ và khóa loại trừ lẫn nhau của biến được chia sẻ đều được thực hiện tự động đằng sau hậu trường.multiprocessing.Pipe class, which returns two multiprocessing.connection.Connection objects.

Ví dụ:

.....

# Khởi tạo một biến được chia sẻ số nguyên

conn1,conn2=multiprocessing.Pipe(),conn2=multiprocessing.Pipe()

Biến này sau đó có thể được khởi tạo trong quy trình cha và được chia sẻ với quy trình con

Chúng ta có thể thay đổi giá trị của biến dữ liệu được chia sẻ thông qua thuộc tính giá trị của Cameron.

Ví dụ:Connection.send() function can be used to send objects from one process to another.

# Thay đổi giá trị của biến được chia sẻ

Ví dụ:

.....

# Khởi tạo một biến được chia sẻ số nguyên

Biến này sau đó có thể được khởi tạo trong quy trình cha và được chia sẻ với quy trình con.send('Hello world')

Chúng ta có thể thay đổi giá trị của biến dữ liệu được chia sẻ thông qua thuộc tính giá trị của Cameron.Connection.recv() function can be used to receive objects in one process sent by another.

Ví dụ:

Ví dụ:

.....

# Khởi tạo một biến được chia sẻ số nguyên

data=conn1.recv()=conn1.recv()

Biến này sau đó có thể được khởi tạo trong quy trình cha và được chia sẻ với quy trình con

Chúng ta có thể thay đổi giá trị của biến dữ liệu được chia sẻ thông qua thuộc tính giá trị của Cameron.

  • Ví dụ:

# Thay đổi giá trị của biến được chia sẻ

Chúng ta có thể truy cập giá trị của biến dữ liệu được chia sẻ thông qua cùng một thuộc tính giá trị trên mạng.multiprocessing.Queue class.

# Truy cập biến được chia sẻput() and from which items can be retrieved by a call to get().

Đa xử lý.queue cung cấp hàng đợi FIFO đầu tiên, đầu tiên, có nghĩa là các mục được lấy từ hàng đợi theo thứ tự chúng được thêm vào. Các mục đầu tiên được thêm vào hàng đợi sẽ là các mục đầu tiên được truy xuất. Điều này trái ngược với các loại hàng đợi khác như hàng đợi trước, lần đầu tiên và ưu tiên.multiprocessing.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.

Đa xử lý.queue có thể được sử dụng trước tiên tạo ra một thể hiện của lớp. Điều này sẽ tạo ra một hàng đợi không giới hạn theo mặc định, nghĩa là một hàng đợi không có giới hạn kích thước.multiprocessing.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ụ:

.....

# đã tạo ra một hàng đợi không giới hạn

queue=multiprocessing.Queue()=multiprocessing.Queue()

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ụ:put(), for example:

.....

# đã tạo ra một hàng đợi không giới hạn

queue.put(item).put(item)

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ụ:put() will block and will not use a timeout.

# Thêm một mục vào hàng đợiget().

Ví dụ:

.....

# đã tạo ra một hàng đợi không giới hạn

item=queue.get()=queue.get()

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ụ:get() will block until an item is available to retrieve from the queue and will not use a timeout.

# Thêm một mục vào hàng đợi

  • Theo mặc định, cuộc gọi để đặt () sẽ chặn và sẽ không sử dụng thời gian chờ.

Các mục có thể được lấy từ hàng đợi bằng cách gọi để nhận ().

# Nhận một mục từ hàng đợi
Download my FREE PDF cheat sheet

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:multiprocessing.Value.

Xếp hàng đa bộ trong pythonValue 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.

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.

Bị nhầm lẫn bởi API mô -đun đa xử lý? Tải xuống bảng cheat pdf miễn phí của tôitask() and it will take a shared multiprocessing.Value instance as an argument

Ví dụ về việc trả về một biến thông qua một giá trị

Chúng ta có thể trả về một biến từ một quy trình bằng cách sử dụng đa xử lý.value.task(variable):

Trong ví dụ này, chúng tôi sẽ tạo một đối tượng giá trị được chia sẻ, sau đó tạo một quy trình con mới sẽ thực thi chức năng tùy chỉnh. Hàm sẽ tạo ra một giá trị ngẫu nhiên và lưu trữ nó trong giá trị. Giá trị này sau đó sẽ được trả lại cho quy trình cha mẹ. Cụ thể, quy trình cha sẽ truy cập giá trị được chia sẻ theo 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 quá trình con.random.random() function.

.....

# đã tạo ra một hàng đợi không giới hạn

data=random()=random()

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ụ:

.....

# đã tạo ra một hàng đợi không giới hạn

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ụ:(f'Generated {data}',flush=True)

sleep(data)(data)

# Thêm một mục vào hàng đợi

Theo mặc định, cuộc gọi để đặt () sẽ chặn và sẽ không sử dụng thời gian chờ.

.....

Các mục có thể được lấy từ hàng đợi bằng cách gọi để nhận ().

variable.value=data.value=data

# Nhận một mục từ hàng đợitask() function is listed below.

Ví dụ về việc trả về một biến thông qua một giá trị

Chúng ta có thể trả về một biến từ một quy trình bằng cách sử dụng đa xử lý.value.task(variable):

Trong ví dụ này, chúng tôi sẽ tạo một đối tượng giá trị được chia sẻ, sau đó tạo một quy trình con mới sẽ thực thi chức năng tùy chỉnh. Hàm sẽ tạo ra một giá trị ngẫu nhiên và lưu trữ nó trong giá trị. Giá trị này sau đó sẽ được trả lại cho quy trình cha mẹ. Cụ thể, quy trình cha sẽ truy cập giá trị được chia sẻ theo quy trình con.# generate some data

    data=random()data=random()

Đầu tiên, chúng ta có thể xác định một chức năng để thực thi trong quá trình con.# block, to simulate computational effort

Chúng tôi sẽ đặt tên cho Tác vụ Hàm () và nó sẽ lấy một phiên bản đa xử lý được chia sẻ.print(f'Generated {data}',flush=True)

    sleep(data)sleep(data)

# chức năng thực thi trong một quy trình trẻ em# return data via value

    variable.value=datavariable.value =data

nhiệm vụ def (biến):multiprocessing.Value instance.

& nbsp; & nbsp; & nbsp; & nbsp;# ...

.....

Hàm sau đó sẽ tạo ra một giá trị ngẫu nhiên giữa 0 và 1 bằng cách sử dụng hàm ngẫu nhiên.random ().

variable=Value('f',0.0)=Value('f',0.0)

# Tạo một số dữ liệumultiprocessing.Process instance and configure it to execute our task() function and pass the shared variable instance as an argument.

.....

Giá trị được tạo sẽ được báo cáo và quá trình sẽ chặn cho một phần thứ hai để mô phỏng nỗ lực tính toán.

process=Process(target=task,args=(variable,))=Process(target=task,args=(variable,))

# Khối, để mô phỏng nỗ lực tính toán

  • in (f'generated {data} ', flush = true)

Cuối cùng, quy trình con sẽ lưu trữ giá trị được tạo trong biến được chia sẻ để biến cha có thể truy cập nó.join() function.

.....

Điều này mô phỏng giá trị trả lại từ quá trình trẻ em.

process.start().start()

# Trả về dữ liệu qua giá trị

process.join().join()

Kết hợp điều này lại với nhau, hàm hoàn chỉnh () được liệt kê dưới đây.

  • & nbsp; & nbsp; & nbsp; & nbsp;# tạo một số dữ liệu

& nbsp; & nbsp; & nbsp; & nbsp;# block, để mô phỏng nỗ lực tính toánreturn” value from the child process via the shared multiprocessing.Value instance.

.....

& nbsp; & nbsp; & nbsp; & nbsp; in (f'generated {data} ', flush = true)

& nbsp; & nbsp; & nbsp; & nbsp;# trả về dữ liệu qua giá trị(f'Returned: {variable.value}')

Tiếp theo, trong quy trình chính trước tiên, chúng tôi sẽ tạo phiên bản đa xử lý được chia sẻ.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

Chúng tôi sẽ định cấu hình nó để giữ giá trị điểm nổi và khởi tạo nó bằng giá trị 0.

# Tạo biến được chia sẻ

Sau đó, chúng ta có thể tạo một phiên bản đa xử lý mới và cấu hình nó để thực thi hàm nhiệm vụ () của chúng ta và chuyển thể hiện biến được chia sẻ làm đối số.random import random

# Tạo quy trình trẻ emtime import sleep

Nếu bạn mới thực hiện một chức năng trong một quy trình mới, hãy xem hướng dẫn:multiprocessing import Value

Chạy một chức năng trong một quá trình trẻ emmultiprocessing import Process

Ví dụ về việc trả về một biến thông qua một giá trị

Chúng ta có thể trả về một biến từ một quy trình bằng cách sử dụng đa xử lý.value.task(variable):

Trong ví dụ này, chúng tôi sẽ tạo một đối tượng giá trị được chia sẻ, sau đó tạo một quy trình con mới sẽ thực thi chức năng tùy chỉnh. Hàm sẽ tạo ra một giá trị ngẫu nhiên và lưu trữ nó trong giá trị. Giá trị này sau đó sẽ được trả lại cho quy trình cha mẹ. Cụ thể, quy trình cha sẽ truy cập giá trị được chia sẻ theo quy trình con.# generate some data

    data=random()data=random()

Đầu tiên, chúng ta có thể xác định một chức năng để thực thi trong quá trình con.# block, to simulate computational effort

& nbsp; & nbsp; & nbsp; & nbsp; in (f'generated {data} ', flush = true)print(f'Generated {data}',flush=True)

    sleep(data)sleep(data)

& nbsp; & nbsp; & nbsp; & nbsp;# trả về dữ liệu qua giá trị# return data via value

    variable.value=datavariable.value=data

# Bảo vệ điểm vào

if__name__=='__main__': __name__=='__main__':

& nbsp; & nbsp; & nbsp; & nbsp;# tạo biến được chia sẻ# create shared variable

    variable=Value('f',0.0)variable=Value('f',0.0)

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một quy trình con# create a child process process

    process=Process(target=task,args=(variable,))process =Process(target=task,args=(variable,))

& nbsp; & nbsp; & nbsp; & nbsp;# bắt đầu quá trình# start the process

    process.start()process.start()

& nbsp; & nbsp; & nbsp; & nbsp;# chờ quá trình kết thúc# wait for the process to finish

    process.join()process.join()

& nbsp; & nbsp; & nbsp; & nbsp;# Báo cáo giá trị trả về# report return value

& nbsp; & nbsp; & nbsp; & nbsp; print (f'returned: {varable.value} ')print(f'Returned: {variable.value}')

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.

Tạo 0,9047471579259425

Trả lại: 0,904747128486333


Khóa học đa xử lý Python miễn phí

Tải xuống bảng cheat API đa xử lý của tôi và như một phần thưởng, bạn sẽ có quyền truy cập miễn phí vào khóa học email 7 ngày 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 và cách sử dụng khóa và semaphores.

Tìm hiểu thêm & NBSP;
 


Ví dụ về việc trả lại một biến thông qua một đường ống

Chú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.

# chức năng thực thi trong một quy trình trẻ em

nhiệm vụ def (kết nối):task(connection):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một số dữ liệu# generate some data

    data=random()data=random()

& nbsp; & nbsp; & nbsp; & nbsp;# block, để mô phỏng nỗ lực tính toán# block, to simulate computational effort

& nbsp; & nbsp; & nbsp; & nbsp; in (f'generated {data} ', flush = true)print(f'Generated {data}',flush=True)

    sleep(data)sleep(data)

& nbsp; & nbsp; & nbsp; & nbsp;# trả về dữ liệu qua đường ống# return data via pipe

    connection.send(data)connection.send(data)

Quy trình chính trước tiên sẽ tạo đa xử lý.pipe trả về hai đối tượng kết nối.multiprocessing.Pipe which return two connection objects.

Đối tượng kết nối đầu tiên chỉ được sử dụng để nhận dữ liệu từ quy trình con và đối tượng kết nối thứ hai chỉ được sử dụng để gửi dữ liệu từ quy trình con.

.....

# Tạo đường ống

conn1,conn2=Pipe(),conn2=Pipe()

Sau đó, chúng ta có thể định cấu hình phiên bản đa xử lý mới. Sau đó, quá trình trẻ em sau đó có thể được bắt đầu.multiprocessing.Process instance to execute our task() function and pass it the connection object for sending. Then the child process can then be started.

.....

# Tạo đường ống

process=Process(target=task,args=(conn2,))=Process(target=task,args=(conn2,))

Sau đó, chúng ta có thể định cấu hình phiên bản đa xử lý mới. Sau đó, quá trình trẻ em sau đó có thể được bắt đầu.

process.start().start()

# Tạo quy trình trẻ emrecv() function on the connection and wait for a result to be “returned” or sent from the child process.

.....

# Tạo đường ống

value=conn1.recv()=conn1.recv()

Sau đó, chúng ta có thể định cấu hình phiên bản đa xử lý mới. Sau đó, quá trình trẻ em sau đó có thể được bắt đầu.

.....

# Tạo đường ống

Sau đó, chúng ta có thể định cấu hình phiên bản đa xử lý mới. Sau đó, quá trình trẻ em sau đó có thể được bắt đầu.(f'Returned: {value}')

# Tạo quy trình trẻ em

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

# Bắt đầu quá trình

Quá trình cha mẹ sau đó sẽ gọi hàm recv () trên kết nối và chờ kết quả được trả lại trên mạng hoặc được gửi từ quy trình con.

# Chờ giá trị trả vềrandom import random

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.time import sleep

# Báo cáo giá trị trả vềmultiprocessing import Pipe

in (f'returned: {value} ')multiprocessing import Process

# chức năng thực thi trong một quy trình trẻ em

nhiệm vụ def (kết nối):task(connection):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một số dữ liệu# generate some data

    data=random()data=random()

& nbsp; & nbsp; & nbsp; & nbsp;# block, để mô phỏng nỗ lực tính toán# block, to simulate computational effort

& nbsp; & nbsp; & nbsp; & nbsp; in (f'generated {data} ', flush = true)print(f'Generated {data}',flush=True)

    sleep(data)sleep(data)

& nbsp; & nbsp; & nbsp; & nbsp;# trả về dữ liệu qua đường ống# return data via pipe

    connection.send(data)connection.send(data)

# Bảo vệ điểm vào

if__name__=='__main__': __name__=='__main__':

& nbsp; & nbsp; & nbsp; & nbsp;# tạo đường ống# create the pipe

    conn1,conn2=Pipe()conn1,conn2=Pipe()

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một quy trình con# create a child process process

    process=Process(target=task,args=(conn2,))process =Process(target=task,args=(conn2,))

& nbsp; & nbsp; & nbsp; & nbsp;# bắt đầu quá trình# start the process

    process.start()process.start()

& nbsp; & nbsp; & nbsp; & nbsp;# chờ giá trị trả về# wait for the return value

    value=conn1.recv()value=conn1.recv()

& nbsp; & nbsp; & nbsp; & nbsp;# Báo cáo giá trị trả về# report return value

& nbsp; & nbsp; & nbsp; & nbsp; in (f'returned: {value} ')print(f'Returned: {value}')

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.

Tạo 0,7498487341429124

Trả lại: 0,7498487341429124

Ví dụ về việc trả về một biến thông qua hàng đợi

Chú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, 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.

# chức năng thực thi trong một quy trình trẻ em

nhiệm vụ def (hàng đợi):task(queue):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một số dữ liệu# generate some data

    data=random()data=random()

& nbsp; & nbsp; & nbsp; & nbsp;# block, để mô phỏng nỗ lực tính toán# block, to simulate computational effort

& nbsp; & nbsp; & nbsp; & nbsp; in (f'generated {data} ', flush = true)print(f'Generated {data}',flush=True)

    sleep(data)sleep(data)

& nbsp; & nbsp; & nbsp; & nbsp;# return dữ liệu qua hàng đợi# return data via queue

    queue.put(data)queue.put(data)

Quá trình chính trước tiên sẽ tạo ra đa xử lý.queue sẽ được chia sẻ giữa các quy trình.multiprocessing.Queue which will be shared between the processes.

.....

# Tạo hàng đợi

queue=Queue()=Queue()

Sau đó, chúng ta có thể định cấu hình phiên bản đa xử lý mới. Sau đó, quá trình trẻ em sau đó có thể được bắt đầu.multiprocessing.Process instance to execute our task() function and pass it the shared Queue object. Then the child process can then be started.

.....

# Tạo hàng đợi

process=Process(target=task,args=(queue,))=Process(target=task,args=(queue,))

Sau đó, chúng ta có thể định cấu hình phiên bản đa xử lý mới. Sau đó, quá trình trẻ em sau đó có thể được bắt đầu.

process.start().start()

# Tạo quy trình trẻ emget() function on the Queue and wait for a result to be “returned” or sent from the child process.

.....

# Tạo hàng đợi

value=queue.get()=queue.get()

Sau đó, chúng ta có thể định cấu hình phiên bản đa xử lý mới. Sau đó, quá trình trẻ em sau đó có thể được bắt đầu.

.....

# Tạo hàng đợi

Sau đó, chúng ta có thể định cấu hình phiên bản đa xử lý mới. Sau đó, quá trình trẻ em sau đó có thể được bắt đầu.(f'Returned: {value}')

# Tạo quy trình trẻ em

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

# Bắt đầu quá trình

Quá trình cha mẹ sau đó sẽ gọi hàm get () trên hàng đợi và chờ kết quả được trả lại trên mạng hoặc được gửi từ quy trình con.

# Chờ giá trị trả vềrandom import random

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.time import sleep

# Báo cáo giá trị trả vềmultiprocessing import Queue

in (f'returned: {value} ')multiprocessing import Process

# chức năng thực thi trong một quy trình trẻ em

nhiệm vụ def (hàng đợi):task(queue):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một số dữ liệu# generate some data

    data=random()data=random()

& nbsp; & nbsp; & nbsp; & nbsp;# block, để mô phỏng nỗ lực tính toán# block, to simulate computational effort

& nbsp; & nbsp; & nbsp; & nbsp; in (f'generated {data} ', flush = true)print(f'Generated {data}',flush=True)

    sleep(data)sleep(data)

& nbsp; & nbsp; & nbsp; & nbsp;# return dữ liệu qua hàng đợi# return data via queue

    queue.put(data)queue.put(data)

# Bảo vệ điểm vào

if__name__=='__main__': __name__=='__main__':

Quá trình chính trước tiên sẽ tạo ra đa xử lý.queue sẽ được chia sẻ giữa các quy trình.# create the queue

    queue=Queue()queue=Queue()

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một quy trình con# create a child process process

    process=Process(target=task,args=(queue,))process =Process(target=task,args=(queue,))

& nbsp; & nbsp; & nbsp; & nbsp;# bắt đầu quá trình# start the process

    process.start()process.start()

& nbsp; & nbsp; & nbsp; & nbsp;# chờ giá trị trả về# wait for the return value

    value=queue.get()value=queue.get()

& nbsp; & nbsp; & nbsp; & nbsp;# Báo cáo giá trị trả về# report return value

& nbsp; & nbsp; & nbsp; & nbsp; in (f'returned: {value} ')print(f'Returned: {value}')

Chạy ví dụ đầu tiên tạo đường ống, trả về hai đối tượng kết nối.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 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ẹ 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.

Tạo 0,3732253790840232

Trả lại: 0,3732253790840232

Đọc thêm

Phần này cung cấp các tài nguyên bổ sung mà bạn có thể thấy hữu ích.

API

  • Đa xử lý-song song dựa trên quy trình
  • PEP 371 - Bổ sung gói đa xử lý

Hướng dẫn

  • Đa xử lý Python: Hướng dẫn hoàn chỉnh

Sách

  • Tờ Cheat API mô -đun đa xử lý
  • Câu hỏi phỏng vấn API đa xử lý
  • Python Multiprocessing Jump-Start, Jason Brownlee, 2022 (cuốn sách của tôi!).my book!).

Takeaways

Bâ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.
Ask your questions in the comments below and I will do my best to answer.

Ảnh của Sean Chen trên unplash

Làm thế nào chúng ta có thể nhận được giá trị trả về từ quá trình đa xử lý?

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ì?

Nó mang lại một kết quả được trả về từ chức năng mục tiêu đã cho được gọi với một mục từ một mục được cho là có thể.Người ta thường gọi bản đồ và lặp lại kết quả trong vòng lặp.Đa xử lý.hồ bơi.one result returned from the given target function called with one item from a given iterable. It is common to call map and iterate the results in a for-loop. The multiprocessing. pool.

Làm thế nào để bạn gọi một chức năng bằng cách sử dụng đa xử lý trong Python?

Để chạy một chức năng trong một quy trình khác:..
Tạo một thể hiện của đa xử lý.Lớp học quá trình ..
Chỉ định tên của chức năng thông qua đối số của mục tiêu trên mạng ..
Gọi hàm start () ..

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).