Hướng dẫn python multiprocessing global variable - biến toàn cầu đa xử lý python

Bạn có thể chia sẻ một biến toàn cầu với tất cả các quy trình nhân viên trẻ em trong nhóm đa xử lý bằng cách xác định nó trong chức năng khởi tạo quy trình công nhân.share a global variable with all child workers processes in the multiprocessing pool by defining it in the worker process initialization function.

Trong hướng dẫn này, bạn sẽ khám phá cách chia sẻ các biến toàn cầu với tất cả các công nhân trong nhóm quy trình Python.share global variables with all workers in the Python process pool.

Bắt đầu nào.

  • Cần chia sẻ biến toàn cầu với tất cả các công nhân trong nhóm quy trình
  • Cách chia sẻ một biến toàn cầu với tất cả các công nhân
  • Ví dụ về việc chia sẻ một biến toàn cầu với tất cả các công nhân
  • Đọc thêm
  • Takeaways

Cần chia sẻ biến toàn cầu với tất cả các công nhân trong nhóm quy trình

Cách chia sẻ một biến toàn cầu với tất cả các công nhânmultiprocessing.pool.Pool in Python provides a pool of reusable processes for executing ad hoc tasks.

Ví dụ về việc chia sẻ một biến toàn cầu với tất cả các công nhân

Đọc thêm

Takeaways

Multiprocessing.pool.pool in Python cung cấp một nhóm các quy trình có thể tái sử dụng để thực hiện các tác vụ ad hoc.apply() or we can apply the same function to an iterable of items using functions such as map().

Một nhóm quy trình có thể được cấu hình khi nó được tạo, sẽ chuẩn bị cho nhân viên trẻ em.apply_async() and map_async().

Một đối tượng nhóm quy trình kiểm soát một nhóm các quy trình công nhân mà công việc có thể được gửi. Nó hỗ trợ kết quả không đồng bộ với thời gian chờ và gọi lại và có triển khai bản đồ song song.

-Đa xử lý-song song dựa trên quy trình

Chúng tôi có thể phát hành các tác vụ một lần cho nhóm quy trình bằng các hàm như Ứng dụng () hoặc chúng tôi có thể áp dụng chức năng tương tự cho một mục có thể sử dụng các chức năng như MAP ().

  • Kết quả cho các tác vụ được ban hành sau đó có thể được truy xuất đồng bộ hoặc chúng ta có thể truy xuất kết quả của các tác vụ sau đó bằng cách sử dụng các phiên bản không đồng bộ của các hàm như application_async () và map_async ().
  • Khi sử dụng nhóm quy trình, chúng tôi có thể cần chia sẻ một biến toàn cầu với tất cả các quy trình nhân viên trẻ em trong nhóm quy trình.
  • Điều này sẽ cho phép tất cả các tác vụ được thực hiện trong nhóm quy trình sử dụng biến toàn cầu được chia sẻ.

Chúng ta có thể cần khả năng này vì nhiều lý do, chẳng hạn như:

Cho phép tất cả các nhiệm vụ sử dụng nhật ký được chia sẻ.

Cho phép tất cả các nhiệm vụ sử dụng hàng đợi hoặc đường ống chung.

Cho phép tất cả các nhiệm vụ sử dụng một nguyên thủy đồng bộ hóa chung như khóa, semaphore hoặc sự kiện.

Nhóm quy trình không cung cấp khả năng này.

Làm thế nào chúng ta có thể chia sẻ một biến toàn cầu với tất cả các quy trình công nhân trẻ em?

Hoặc, đặt một cách khác:

Làm thế nào một biến toàn cầu được chia sẻ có thể được truy cập bởi tất cả các tác vụ được thực hiện bởi nhóm quy trình trong Python?..

Chúng tôi có thể chia sẻ một biến toàn cầu với tất cả các nhân viên quy trình trẻ em trong nhóm quy trình.

pool=Pool(initializer=init_worker,initargs=(data,))=Pool(initializer=init_worker,initargs=(data,))

Điều này có thể đạt được bằng cách định cấu hình nhóm quy trình để khởi tạo từng quy trình của công nhân bằng cách sử dụng một chức năng tùy chỉnh.

Ví dụ:global” in a function will define a global variable for the process, rather than a local variable for the function.

...

Hoặc, đặt một cách khác:

Làm thế nào một biến toàn cầu được chia sẻ có thể được truy cập bởi tất cả các tác vụ được thực hiện bởi nhóm quy trình trong Python?

Chúng tôi có thể chia sẻ một biến toàn cầu với tất cả các nhân viên quy trình trẻ em trong nhóm quy trình.init_worker(data):

Điều này có thể đạt được bằng cách định cấu hình nhóm quy trình để khởi tạo từng quy trình của công nhân bằng cách sử dụng một chức năng tùy chỉnh.# declare scope of a new global variable

    globalshared_dataglobalshared_data

Ví dụ:# store argument in the global variable for this process

    shared_data=datashared_data =data

...

# Tạo một nhóm quy trình với khởi tạo tùy chỉnh

Hoặc, đặt một cách khác:

Làm thế nào một biến toàn cầu được chia sẻ có thể được truy cập bởi tất cả các tác vụ được thực hiện bởi nhóm quy trình trong Python?

Chúng tôi có thể chia sẻ một biến toàn cầu với tất cả các nhân viên quy trình trẻ em trong nhóm quy trình.task():

Điều này có thể đạt được bằng cách định cấu hình nhóm quy trình để khởi tạo từng quy trình của công nhân bằng cách sử dụng một chức năng tùy chỉnh.

print(shared_data)(shared_data)

Ví dụ:

  • ...

# Tạo một nhóm quy trình với khởi tạo tùy chỉnh

Dữ liệu biến toàn cầu theo yêu cầu của mỗi quy trình nhân viên trẻ em có thể được truyền như một đối số cho chức năng khởi tạo. Sau đó nó có thể được lưu trữ trong một biến toàn cầu. Điều này sẽ làm cho nó có sẵn cho mỗi quy trình nhân viên trẻ em.
Download my FREE PDF cheat sheet

Ví dụ về việc chia sẻ một biến toàn cầu với tất cả các công nhân

Đọc thêm

Takeaways

Đầu tiên, chúng ta cần xác định chức năng tùy chỉnh được sử dụng để khởi tạo các quy trình nhân viên trẻ em.

Hàm khởi tạo phải lấy hàng đợi được chia sẻ làm đối số. Sau đó, nó sẽ khai báo một biến toàn cầu mới cho quy trình trẻ em và lưu trữ một tham chiếu đến hàng đợi được chia sẻ trong biến toàn cầu.

Hàm init_worker () bên dưới thực hiện điều này.init_worker() function below implements this.

# Khởi tạo các quy trình công nhân

def init_worker (Shared_queue):init_worker(shared_queue):

& nbsp; & nbsp; & nbsp; & nbsp;# khai báo phạm vi của một biến toàn cầu mới# declare scope of a new global variable

    globalqueueglobalqueue

& nbsp; & nbsp; & nbsp; & nbsp;# lưu trữ đối số trong biến toàn cầu cho quá trình này# store argument in the global variable for this process

    queue=shared_queuequeue =shared_queue

Tiếp theo, chúng ta có thể xác định chức năng tác vụ tùy chỉnh để thực thi trong nhóm quy trình.

Hàm tác vụ sẽ lấy một định danh số nguyên làm số làm đối số. Sau đó, nó sẽ tạo ra một số từ 0 đến 5, sau đó chặn trong nhiều giây để mô phỏng một lượng nỗ lực tính toán khác nhau. Cuối cùng, nó sẽ gửi số được tạo và định danh số nguyên dưới dạng một bộ phận vào hàng đợi được chia sẻ.

Hàm nhiệm vụ () bên dưới thực hiện điều này.task() function below implements this.

Lưu ý rằng chúng tôi xác định rõ ràng phạm vi của biến toàn cầu hàng đợi. Điều này là không cần thiết về mặt kỹ thuật, nhưng tôi tin rằng nó giúp làm cho mã dễ đọc hơn.

# Nhiệm vụ được thực hiện trong một quy trình công nhân

Nhiệm vụ Def (Định danh):task(identifier):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một giá trị# generate a value

    value=random()*5value=random()*5

& nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment

    sleep(value)sleep(value)

& nbsp; & nbsp; & nbsp; & nbsp;# phạm vi khai báo của hàng đợi được chia sẻ# declare scope of shared queue

    globalqueueglobalqueue

& nbsp; & nbsp; & nbsp; & nbsp;# gửi kết quả bằng cách sử dụng hàng đợi chia sẻ# send result using shared queue

    queue.put((identifier,value))queue.put((identifier, value))

Tiếp theo, trong quy trình chính trước tiên chúng ta có thể tạo hàng đợi đa xử lý được chia sẻ. Chúng tôi sẽ sử dụng đa xử lý.Simplequeue trong trường hợp này.multiprocessing.SimpleQueue in this case.

.....

# Tạo một hàng đợi được chia sẻ

shared_queue=SimpleQueue()=SimpleQueue()

Bạn có thể tìm hiểu thêm về đa xử lý.simplequeue trong hướng dẫn:multiprocessing.SimpleQueue in the tutorial:

  • Đơn giản đa bộ xử lý trong Python

Tiếp theo, chúng ta có thể tạo và định cấu hình nhóm quy trình.

Trong trường hợp này, chúng tôi sẽ định cấu hình để mỗi quy trình công nhân được khởi tạo bằng hàm khởi tạo tùy chỉnh init_worker () của chúng tôi và chuyển hàng đợi được chia sẻ làm đối số.init_worker() custom initialization function and pass the shared queue as an argument.

Chúng tôi sẽ sử dụng giao diện Trình quản lý ngữ cảnh để nhóm xử lý được đóng tự động cho chúng tôi sau khi chúng tôi kết thúc với nó.

.....

# Tạo một hàng đợi được chia sẻ

Bạn có thể tìm hiểu thêm về đa xử lý.simplequeue trong hướng dẫn:Pool(initializer=init_worker,initargs=(shared_queue,))aspool:

Đơn giản đa bộ xử lý trong Python

Tiếp theo, chúng ta có thể tạo và định cấu hình nhóm quy trình.

  • Trong trường hợp này, chúng tôi sẽ định cấu hình để mỗi quy trình công nhân được khởi tạo bằng hàm khởi tạo tùy chỉnh init_worker () của chúng tôi và chuyển hàng đợi được chia sẻ làm đối số.

Chúng tôi sẽ sử dụng giao diện Trình quản lý ngữ cảnh để nhóm xử lý được đóng tự động cho chúng tôi sau khi chúng tôi kết thúc với nó.map_async() function.

.....

# Tạo một hàng đợi được chia sẻ

_=pool.map_async(task,range(10))=pool.map_async(task,range(10))

Bạn có thể tìm hiểu thêm về đa xử lý.simplequeue trong hướng dẫn:imap_unordered() function). This can be achieved by iterating over the expected number of results and calling get() ob the shared queue for each task result.

.....

# Tạo một hàng đợi được chia sẻ

foriinrange(10):iinrange(10):

    result=shared_queue.get()result=shared_queue.get()

Bạn có thể tìm hiểu thêm về đa xử lý.simplequeue trong hướng dẫn:print(f'Got {result}',flush=True)

Đơn giản đa bộ xử lý trong Python

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

30

31

32

33

34

35

36

37

Tiếp theo, chúng ta có thể tạo và định cấu hình nhóm quy trình.

Trong trường hợp này, chúng tôi sẽ định cấu hình để mỗi quy trình công nhân được khởi tạo bằng hàm khởi tạo tùy chỉnh init_worker () của chúng tôi và chuyển hàng đợi được chia sẻ làm đối số.

Chúng tôi sẽ sử dụng giao diện Trình quản lý ngữ cảnh để nhóm xử lý được đóng tự động cho chúng tôi sau khi chúng tôi kết thúc với nó.random import random

# Tạo và định cấu hình nhóm quy trìnhtime import sleep

với pool (initchizer = init_worker, initArgs = (shared_queue,)) aspool:multiprocessing import SimpleQueue

# ...multiprocessing.pool import Pool

# Khởi tạo các quy trình công nhân

def init_worker (Shared_queue):init_worker(shared_queue):

& nbsp; & nbsp; & nbsp; & nbsp;# khai báo phạm vi của một biến toàn cầu mới# declare scope of a new global variable

    globalqueueglobalqueue

& nbsp; & nbsp; & nbsp; & nbsp;# lưu trữ đối số trong biến toàn cầu cho quá trình này# store argument in the global variable for this process

    queue=shared_queuequeue =shared_queue

# Nhiệm vụ được thực hiện trong một quy trình công nhân

Nhiệm vụ Def (Định danh):task(identifier):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một giá trị# generate a value

    value=random()*5value=random()* 5

& nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment

    sleep(value)sleep(value)

& nbsp; & nbsp; & nbsp; & nbsp;# phạm vi khai báo của hàng đợi được chia sẻ# declare scope of shared queue

    globalqueueglobalqueue

& nbsp; & nbsp; & nbsp; & nbsp;# gửi kết quả bằng cách sử dụng hàng đợi chia sẻ# send result using shared queue

    queue.put((identifier,value))queue.put((identifier, value))

Tiếp theo, trong quy trình chính trước tiên chúng ta có thể tạo hàng đợi đa xử lý được chia sẻ. Chúng tôi sẽ sử dụng đa xử lý.Simplequeue trong trường hợp này.

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

...# create a shared queue

    shared_queue=SimpleQueue()shared_queue=SimpleQueue()

# Tạo một hàng đợi được chia sẻ# create and configure the process pool

Bạn có thể tìm hiểu thêm về đa xử lý.simplequeue trong hướng dẫn:with Pool(initializer=init_worker,initargs=(shared_queue,))aspool:

Đơn giản đa bộ xử lý trong Python# issue tasks into the process pool

        _=pool.map_async(task,range(10))_=pool.map_async(task,range(10))

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# read results from the queue as they become available

        foriinrange(10):for iinrange(10):

            result=shared_queue.get()result=shared_queue.get()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print(f'Got {result}',flush=True)

Chạy ví dụ đầu tiên tạo ra hàng đợi được chia sẻ.

Tiếp theo, nhóm quy trình được tạo và cấu hình để sử dụng chức năng khởi tạo tùy chỉnh.

Mỗi quy trình công nhân được tạo và bắt đầu sau đó được khởi tạo với chức năng khởi tạo tùy chỉnh. Mỗi công nhân tạo ra một biến toàn cầu mới có tên là hàng đợi và lưu trữ được vượt qua trong hàng đợi được chia sẻ chống lại biến toàn cầu. Điều này làm cho hàng đợi hàng đợi có sẵn cho tất cả các nhiệm vụ được thực hiện bởi quy trình công nhân và tất cả các quy trình công nhân được khởi tạo theo cùng một cách.queue” and stores the passed in shared queue against the global variable. This makes “queue” available to all tasks executed by the worker process, and all worker processes are initialized the same way.

Tiếp theo, 10 nhiệm vụ được cấp vào nhóm quy trình.

Quá trình chính sau đó lặp lại 10 kết quả, gọi get () trên hàng đợi sẽ chặn và không quay lại cho đến khi có kết quả.

Mỗi tác vụ trước tiên tạo ra một số ngẫu nhiên trong khoảng từ 0 đến 5, sau đó chặn trong nhiều giây để mô phỏng nỗ lực tính toán. Biến toàn cầu của hàng đợi trên hàng đợi cho quy trình được khai báo rõ ràng, sau đó được truy cập. Kết quả cho nhiệm vụ được đặt vào hàng đợi và nhiệm vụ hoàn thành.queue” global variable for the process is declared explicitly, then accessed. The result for the task is put on the queue and the task completes.

Kết quả được báo cáo trong quá trình chính khi chúng có sẵn.

Sau khi tất cả 10 kết quả được lấy từ hàng đợi được chia sẻ, quá trình chính tiếp tục bật, tự động đóng nhóm quy trình và sau đó đóng ứng dụng.

Lưu ý, kết quả cụ thể sẽ khác nhau mỗi khi chương trình được chạy do sử dụng các số ngẫu nhiên.

Có (2, 0.38947694846648895)

GOT (3, 0.766542579985037)

Got (4, 1.6182597482880667)

Got (6, 2.912364034686572)

Got (7, 3.0557058569816458)

Got (8, 2.6846243338785)

Got (0, 3.589396223885189)

Got (5, 4.1921930714219116)

Got (1, 4.282642869898409)

GOT (9, 4.827317385371338)


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

Tải xuống bảng cheat API Pool API của tôi và như một phần thưởng, bạn sẽ được 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 nhóm đa xử lý bao gồm cách định cấu hình số lượng công nhân và cách thực hiện các tác vụ không đồng bộ.

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


Đọ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
  • Nhóm đa xử lý: Hướng dẫn hoàn chỉnh
  • Bảng cheat API lớp nhóm
  • Câu hỏi phỏng vấn API đa xử lý
  • Đa bộ xử lý nhóm khởi động (khóa học 7 ngày của tôi)

Takeaways

Bây giờ bạn đã biết cách chia sẻ các biến toàn cầu với tất cả các công nhân trong nhóm quy trình Python.

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 Jeremy Bezanger trên unplash