Hướng dẫn multiprocessing pool python return value - giá trị trả về của python pool đa xử lý

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)

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.

  • 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

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ì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ịmultiprocessing.Value object.
  • Ví dụ về việc trả lại một biến thông qua một đường ốngmultiprocessing.Pipe object.
  • Ví dụ về việc trả về một biến thông qua hàng đợimultiprocessing.Queue object.

Đọc thêm

  • Takeawaysmultiprocessing.Manager, e.g. processes interact with the same object via proxies.
  • 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.multiprocessing.sharedctypes, e.g. same methods that underlie multiprocessing.Value.
  • 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.multiprocessing.shared_memory.

Đô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.
Let me know in the comments below.

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ộ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ý.

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?

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

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:

Đâ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?

data.value=100.value=100

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:

Đâ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?

value=data.value=data.value

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 ống

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

Đâ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?

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

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

.....

# Gửi một đối tượng

Conn2.Send ('Hello World').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.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ụ:

.....

# Gửi một đối tượng

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

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.

  • Các đối tượng nhận được sẽ tự động không bị ảnh hưởng.

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

.....

# Gửi một đối tượng

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

Conn2.Send ('Hello World')put(), for example:

.....

# Gửi một đối tượng

queue.put(item).put(item)

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

.....

# Gửi một đối tượng

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

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.

  • Các đối tượng nhận được sẽ tự động không bị ảnh hưởng.

# 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.
Download my FREE PDF cheat sheet

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

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

Đ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.task(variable):

# đã 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ụ:random.random() function.

.....

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

data=random()=random()

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

sleep(data)(data)

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:

.....

Xếp hàng đa bộ trong python

variable.value=data.value=data

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.

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

Đ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.task(variable):

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

    data=random()data=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ụ:# block, to simulate computational effort

# Thêm một mục vào hàng đợiprint(f'Generated {data}',flush=True)

    sleep(data)sleep(data)

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

    variable.value=datavariable.value =data

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

.....

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

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

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.

.....

Xếp hàng đa bộ trong python

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

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ôi

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

.....

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.

process.start().start()

# Chờ quá trình kết thúc

process.join().join()

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:

  • Làm thế nào để tham gia một quá trình trong Python

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.

.....

# Báo cáo giá trị trả về

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

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.

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

# SuperfastPython.com

# Ví dụ về việc trả về một biến từ một quy trình bằng cách sử dụng giá trị

từ nhập ngẫu nhiên ngẫu nhiênrandom import random

từ thời gian nhập vào giấc ngủtime import sleep

từ giá trị nhập đa xử lýmultiprocessing import Value

Từ quá trình nhập bộ xử lý đa xử lýmultiprocessing import Process

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

nhiệm vụ def (biến):task(variable):

& 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 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í

Đă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 ố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 (biến):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 giá trị# return data via pipe

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

# 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;# tạo một quy trình con

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

& 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;# chờ quá trình kết thúc

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

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

process.start().start()

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

.....

# Chờ giá trị trả về

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

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.

.....

# Báo cáo giá trị trả về

in (f'returned: {value} ')(f'Returned: {value}')

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.

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

# SuperfastPython.com

# Ví dụ về việc trả về một biến từ một quá trình bằng cách sử dụng một đường ống

từ nhập ngẫu nhiên ngẫu nhiênrandom import random

từ thời gian nhập vào giấc ngủtime import sleep

từ đường bộ nhập khẩu đa xử lýmultiprocessing import Pipe

Từ quá trình nhập bộ xử lý đa xử lý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 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.

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

nhiệm vụ def (kết nố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;# trả về dữ liệu qua đường ống# return data via queue

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

# Bảo vệ điểm vàomultiprocessing.Queue which will be shared between the processes.

.....

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

queue=Queue()=Queue()

& 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ắt đầu quá trình

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

& nbsp; & nbsp; & nbsp; & nbsp;# chờ giá trị trả về

process.start().start()

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

.....

# Chờ giá trị trả về

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

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.

.....

# Báo cáo giá trị trả về

in (f'returned: {value} ')(f'Returned: {value}')

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.

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

# SuperfastPython.com

# Ví dụ về việc trả về một biến từ một quá trình bằng cách sử dụng một đường ống

từ nhập ngẫu nhiên ngẫu nhiênrandom import random

từ thời gian nhập vào giấc ngủtime import sleep

từ đường bộ nhập khẩu đa xử lýmultiprocessing import Queue

Từ quá trình nhập bộ xử lý đa xử lý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(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;# trả về dữ liệu qua đường ống# return data via queue

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

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

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

& nbsp; & nbsp; & nbsp; & nbsp;# tạo hàng đợi# 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 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.

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.

  • Đa xử lý-song song dựa trên quy trình
  • Đa xử lý: Hướng dẫn hoàn chỉnh
  • Tờ Cheat API mô -đun đa xử lý
  • Câu hỏi phỏng vấn API đa xử lý
  • Khởi động đa bộ xử lý (khóa học 7 ngày của tôi)

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 để 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.