Hàm ánh xạ có thể có bao nhiêu đối số trong Python?

Hàm map[] nhóm đa xử lý không thể được sử dụng trực tiếp với hàm đích nhận nhiều đối số

Thay vào đó, bạn cần sử dụng một hàm thay thế như starmap[] hoặc một giải pháp thay thế như hàm bao bọc

Trong hướng dẫn này, bạn sẽ khám phá cách gọi hàm nhóm map[] đa xử lý với nhiều đối số một cách gián tiếp và cách sử dụng các phương pháp thay thế để thực thi các hàm mục tiêu nhận nhiều đối số

Bắt đầu nào

Mục lục

  • Nhu cầu sử dụng hồ bơi. map[] Với nhiều đối số
  • Cách sử dụng hồ bơi. map[] Với nhiều đối số
    • sử dụng hồ bơi. apply_async[] Thay vào đó
    • sử dụng hồ bơi. starmap[] Thay vào đó
    • Thay đổi chức năng mục tiêu thành giải nén đối số
    • Sử dụng hàm Wrapper để giải nén đối số
  • Nhiều đối số với Pool. áp dụng_async[]
  • Nhiều đối số với Pool. sơ đồ sao[]
  • Nhiều đối số với Pool. map[] và giải nén đối số
  • Nhiều đối số với Pool. map[] và hàm Wrapper
  • Đọc thêm
  • mang đi

Nhu cầu sử dụng hồ bơi. map[] Với nhiều đối số

Hàm map[] tích hợp sẽ gọi một hàm cho từng mục trên một lần lặp

Ví dụ

1

2

3

4

.. .

# chức năng gọi cho từng mục trong một lần lặp

cho kết quả trong bản đồ[task, items]:

in[kết quả]

Một lợi ích của hàm map[] tích hợp là nó có thể thực hiện nhiều lần lặp. Mỗi lần lặp sẽ được duyệt qua trong bước khóa, mang lại một đối số cho hàm

Ví dụ

1

2

3

4

.. .

# chức năng gọi cho từng mục trong một lần lặp

cho kết quả trong bản đồ[task, items1, items2]:

in[kết quả]

đa xử lý. Lớp pool cung cấp một phiên bản song song của hàm map[]. Mỗi lệnh gọi đến chức năng đích sẽ được cấp cho nhóm đa xử lý và được thực thi bởi một quy trình worker con

Ví dụ

1

2

3

4

5

6

.. .

# tạo nhóm quy trình

với đa xử lý. Nhóm[] như nhóm . :

# chức năng gọi cho từng mục trong một lần lặp song song

cho kết quả trong nhóm. bản đồ[nhiệm vụ, mục . ]:

in[kết quả]

Bạn có thể tìm hiểu thêm về cách sử dụng hàm multiprocessing pool map[] trong hướng dẫn

  • Nhóm đa xử lý. bản đồ [] trong Python

Một hạn chế của hàm map[] nhóm đa xử lý là nó chỉ nhận một đối số có thể lặp lại duy nhất cho hàm đích

Điều này có nghĩa là nó chỉ có thể được sử dụng để gọi các hàm mục tiêu nhận một đối số

Làm cách nào chúng ta có thể sử dụng hàm multiprocessing pool map[] với nhiều đối số?

Chạy các vòng lặp của bạn bằng cách sử dụng tất cả các CPU, tải xuống cuốn sách MIỄN PHÍ của tôi để tìm hiểu cách thực hiện

Cách sử dụng hồ bơi. map[] Với nhiều đối số

Có nhiều cách để chúng ta có thể sử dụng hàm nhóm map[] đa xử lý với một hàm mục tiêu nhận nhiều đối số

Chúng ta sẽ xem xét 4 cách tiếp cận phổ biến, đó là

  1. sử dụng hồ bơi. apply_async[] thay vì
  2. sử dụng hồ bơi. starmap[] thay thế
  3. Thay đổi chức năng mục tiêu để giải nén các đối số
  4. Sử dụng hàm bao bọc để giải nén đối số

Chúng ta hãy lần lượt xem xét kỹ hơn từng cách tiếp cận

sử dụng hồ bơi. apply_async[] Thay vào đó

Hàm apply[] của nhóm đa xử lý sẽ thực hiện một lệnh gọi hàm duy nhất trong nhóm quy trình

Điều quan trọng là nó cho phép một hàm được gọi không có đối số, một hoặc nhiều đối số. Như vậy, nó có thể được sử dụng trong một vòng lặp thay vì hàm map[]

Bạn có thể tìm hiểu thêm về hàm apply[] đa xử lý trong hướng dẫn

  • Nhóm đa xử lý. áp dụng [] trong Python

Một hạn chế của apply[] là nó sẽ block mỗi lần gọi cho đến khi target function hoàn thành. Như vậy, nó không mang lại lợi ích của đồng thời

Thay vào đó, chúng ta có thể sử dụng hàm apply_async[], đây là phiên bản không đồng bộ của hàm apply[]. Chúng ta có thể chỉ định nhiều đối số cho hàm mục tiêu của mình bằng cách sử dụng từ khóa “args” và cung cấp một bộ đối số

Ví dụ

1

2

3

.. .

# đưa một tác vụ vào nhóm quy trình với nhiều đối số

async_result = nhóm. apply_async[nhiệm vụ, args=[arg1, arg2, arg3]]

Nó đưa ra lệnh gọi hàm đích vào nhóm quy trình và trả về ngay lập tức với một đối tượng AsyncResult

Những đối tượng này có thể được thu thập bằng cách hiểu danh sách

Ví dụ

1

2

3

.. .

# phát hành nhiều tác vụ, mỗi tác vụ có nhiều đối số

async_results = [nhóm. apply_async[nhiệm vụ, args=[i, i*2, i*3]] for i in range[10]]

Sau đó, chúng ta có thể gọi hàm get[] trên mỗi AsyncResult để lấy giá trị trả về khi cần

Điều này cũng có thể được thực hiện trong một danh sách hiểu

Ví dụ

1

2

3

.. .

# truy xuất kết quả giá trị trả về

kết quả = [ar. nhận[] cho arin async_results]

Bạn có thể tìm hiểu thêm về hàm apply_async[] trong hướng dẫn

  • Nhóm đa xử lý. apply_async[] trong Python

sử dụng hồ bơi. starmap[] Thay vào đó

Hàm starmap[] nhóm đa xử lý sẽ gọi hàm đích có nhiều đối số

Như vậy, nó có thể được sử dụng thay cho hàm map[]. Đây có lẽ là cách tiếp cận ưa thích để thực thi một hàm mục tiêu trong nhóm đa xử lý có nhiều đối số

Hàm starmap[] lấy tên của hàm đích và một hàm có thể lặp lại, giống như hàm map[]

Sự khác biệt là mỗi mục trong iterable phải là một iterable mang lại kết quả cho mỗi lần gọi hàm đích

Cách dễ nhất để nghĩ về điều này là có một danh sách trong đó mỗi mục trong danh sách là một bộ đối số cho một lần gọi hàm đích

Ví dụ

1

2

3

.. .

# chuẩn bị luận cứ

args = [[i, i*2, i*3] for i in range[10]]

Điều này sau đó có thể được chuyển trực tiếp đến hàm starmap[]

Ví dụ

1

2

3

.. .

# phát hành nhiều tác vụ, mỗi tác vụ có nhiều đối số

kết quả = nhóm. sơ đồ sao[nhiệm vụ, args]

Bạn có thể tìm hiểu thêm về hàm starmap[] trong bài hướng dẫn

  • Nhóm đa xử lý. bản đồ sao [] trong Python

Thay đổi chức năng mục tiêu thành giải nén đối số

Chức năng mục tiêu có thể được thay đổi

Thay vì lấy nhiều đối số, nó có thể được sửa đổi để lấy một đối số, chẳng hạn như danh sách hoặc bộ đối số

Sau đó, hàm có thể giải nén các đối số này và hoạt động như bình thường

Ví dụ

1

2

3

4

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[args]:

   # đối số giải nén

    arg1, arg2, arg3 = args

Sau đó, hàm multiprocessing map[] có thể được sử dụng để truyền trực tiếp một danh sách hoặc bộ đối số, mô phỏng một lệnh gọi có nhiều đối số

Ví dụ

1

2

3

4

5

.. .

# chuẩn bị luận cứ

args = [[i, i*2, i*3] for i in range[10]]

# phát hành nhiều tác vụ, mỗi tác vụ có nhiều đối số

kết quả = nhóm. bản đồ[nhiệm vụ, args]

Điều này yêu cầu bạn có thể thay đổi chức năng đích, điều này có thể không đúng với mọi ứng dụng

Sử dụng hàm Wrapper để giải nén đối số

Unwrapping đối số là một sửa chữa dễ dàng

Một cách tiếp cận khác để sử dụng bản sửa lỗi này là sử dụng hàm bao bọc hoặc hàm proxy lấy danh sách hoặc bộ gồm nhiều đối số và được gọi bằng map[] thay vì hàm đích thực

Ví dụ

1

2

3

4

5

.. .

# chuẩn bị luận cứ

args = [[i, i*2, i*3] for i in range[10]]

# phát hành nhiều tác vụ, mỗi tác vụ có nhiều đối số

kết quả = nhóm. map[task_wrapper, args]

Hàm bao bọc sẽ giải nén các đối số và sau đó gọi hàm đích có nhiều đối số

Ví dụ

1

2

3

4

# chức năng bao bọc cho tác vụ

def task_wrapper[args]:

    # gọi task[] và giải nén các đối số

    trả lại nhiệm vụ[*args]

Nhớ lại rằng toán tử dấu sao [*] sẽ giải nén một danh sách hoặc bộ dữ liệu cho chúng ta

Cách tiếp cận này phù hợp với trường hợp bạn có quyền kiểm soát chức năng được gọi bởi map[] nhưng không thể hoặc không muốn thay đổi chức năng đích

Bây giờ chúng ta đã biết cách sử dụng multiprocessing pool map[] với nhiều đối số, hãy xem xét một số ví dụ đã hoạt động

Bối rối với API lớp Pool?
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi

Nhiều đối số với Pool. áp dụng_async[]

Chúng ta có thể khám phá cách sử dụng apply_async[] thay vì map[] để gọi một hàm mục tiêu với nhiều đối số

Trong ví dụ này, chúng ta sẽ định nghĩa một hàm mục tiêu nhận nhiều đối số, chặn một lúc để mô phỏng công việc, báo cáo một thông báo sau đó trả về một giá trị kết hợp các đối số. Người gọi sẽ tạo nhóm quy trình, đưa ra các tác vụ, sau đó truy xuất các giá trị trả về

Đầu tiên, chúng ta có thể định nghĩa hàm task[] nhận nhiều đối số, khối, báo cáo một thông báo sau đó trả về một giá trị trả về

1

2

3

4

5

6

7

8

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[arg1, arg2, arg3]:

   # khối trong giây lát

    ngủ[ngẫu nhiên[]]

   # giá trị báo cáo

    in[f'Nhiệm vụ {arg1}, . ', xả=True]

    # trả về kết quả

    return arg1 + arg2 + arg3

Tiếp theo, trong quy trình chính, chúng ta có thể tạo nhóm quy trình với các đối số mặc định

1

2

3

4

.. .

# tạo nhóm quy trình

với Nhóm[] như pool:

#

Sau đó, chúng tôi sẽ gọi hàm mục tiêu 10 lần, mỗi lần có ba đối số

Mỗi cuộc gọi sẽ trả về một đối tượng AsyncResult cung cấp một điều khiển cho từng tác vụ không đồng bộ trong nhóm đa xử lý

Chúng tôi có thể thu thập các đối tượng này trong một danh sách bằng cách sử dụng hiểu danh sách

Ví dụ

1

2

3

.. .

# phát hành nhiều tác vụ, mỗi tác vụ có nhiều đối số

async_results = [nhóm. apply_async[nhiệm vụ, args=[i, i*2, i*3]] for i in range[10]]

Tiếp theo, chúng ta có thể nhận các giá trị trả về từ mỗi tác vụ đã phát hành

Điều này có thể đạt được bằng cách gọi hàm get[] trên mỗi đối tượng AsyncResult. Hàm này sẽ chặn cho đến khi cuộc gọi hàm được liên kết kết thúc và trả về một giá trị

Điều này cũng có thể đạt được trong cách hiểu danh sách

Ví dụ

1

2

3

.. .

# truy xuất kết quả giá trị trả về

kết quả = [ar. nhận[] cho arin async_results]

Liên kết điều này lại với nhau, ví dụ hoàn chỉnh được liệt kê bên dưới

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#Trăn Siêu Nhanh. com

# ví dụ về nhiều đối số với pool. áp dụng_async

từ thời gian nhập ngủ

từ ngẫu nhiên nhập ngẫu nhiên

từ đa xử lý nhập Nhóm

 

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[arg1, arg2, arg3]:

   # khối trong giây lát

    ngủ[ngẫu nhiên[]]

   # giá trị báo cáo

    in[f'Nhiệm vụ {arg1}, . ', xả=True]

    # trả về kết quả

    return arg1 + arg2 + arg3

 

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

if __name__ == '__main__'.

    # tạo nhóm quy trình

    với Hồ bơi[] as pool:

        # đưa ra nhiều nhiệm vụ, mỗi nhiệm vụ có nhiều đối số

        async_results = [nhóm.apply_async[nhiệm vụ, args=[i, i*2, i*3]] for i in range[10]]

        # truy xuất kết quả giá trị trả về

        kết quả = [ar.nhận[] cho arin async_results]

Chạy ví dụ trước tiên sẽ tạo nhóm quy trình với cấu hình mặc định, sử dụng tất cả các lõi CPU trong hệ thống

Tiếp theo, 10 tác vụ có nhiều đối số được cấp cho nhóm quy trình và danh sách các đối tượng AsyncResult được thu thập ngay lập tức

Các tác vụ bắt đầu thực thi, báo cáo ba đối số nhận được, xác nhận rằng hàm đích đã được gọi với nhiều đối số một cách chính xác

Tiếp theo, các giá trị trả về từ mỗi tác vụ đã phát hành được thu thập vào một danh sách khi các tác vụ hoàn thành

1

2

3

4

5

6

7

8

9

10

Nhiệm vụ 5, 10, 15

Nhiệm vụ 3, 6, 9

Nhiệm vụ 8, 16, 24

Nhiệm vụ 6, 12, 18

Nhiệm vụ 0, 0, 0

Nhiệm vụ 4, 8, 12

Nhiệm vụ 1, 2, 3

Nhiệm vụ 7, 14, 21

Nhiệm vụ 2, 4, 6

Nhiệm vụ 9, 18, 27

Tiếp theo, chúng ta sẽ khám phá cách sử dụng hàm starmap[] để thực thi một hàm mục tiêu trong nhóm đa xử lý nhận nhiều đối số

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

Tải xuống bảng cheat API Pool 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 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 thi các tác vụ không đồng bộ

Tìm hiểu thêm
 

Nhiều đối số với Pool. sơ đồ sao[]

Chúng ta có thể sử dụng hàm starmap[] nhóm đa xử lý để thực thi một hàm mục tiêu nhận nhiều đối số

Trong ví dụ này, chúng ta sẽ định nghĩa một hàm mục tiêu nhận nhiều đối số, sau đó trong quy trình chính, chúng ta sẽ chuẩn bị một danh sách các bộ dữ liệu, mỗi bộ cung cấp một đối số cho hàm mục tiêu, sau đó đưa các tác vụ vào nhóm quy trình để gọi hàm mục tiêu của chúng ta

Đầu tiên, chúng ta có thể định nghĩa một hàm mục tiêu nhận nhiều đối số, chặn trong giây lát, báo cáo một thông báo rồi trả về kết hợp của cả ba đối số

Hàm task[] bên dưới thực hiện điều này

1

2

3

4

5

6

7

8

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[arg1, arg2, arg3]:

   # khối trong giây lát

    ngủ[ngẫu nhiên[]]

   # giá trị báo cáo

    in[f'Nhiệm vụ {arg1}, . ', xả=True]

    # trả về kết quả

    return arg1 + arg2 + arg3

Tiếp theo, trong quy trình chính, chúng ta có thể tạo nhóm đa xử lý với các đối số mặc định

1

2

3

4

.. .

# tạo nhóm quy trình

với Nhóm[] như pool:

#

Tiếp theo, chúng ta có thể tạo một iterable chứa các đối số cho mỗi lệnh gọi đến hàm mục tiêu của chúng ta

1

2

3

.. .

# chuẩn bị luận cứ

args = [[i, i*2, i*3] for i in range[10]]

Cuối cùng, chúng ta có thể gọi hàm starmap[] trên pool. Điều này sẽ đưa ra 10 lệnh gọi hàm task[] mục tiêu với nhiều đối số và trả về một giá trị trả về có thể lặp lại sau khi tất cả các tác vụ đã hoàn thành

1

2

3

.. .

# phát hành nhiều tác vụ, mỗi tác vụ có nhiều đối số

kết quả = nhóm. sơ đồ sao[nhiệm vụ, args]

Liên kết điều này lại với nhau, ví dụ hoàn chỉnh được liệt kê bên dưới

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#Trăn Siêu Nhanh. com

# ví dụ về nhiều đối số với pool. bản đồ sao

từ thời gian nhập ngủ

từ ngẫu nhiên nhập ngẫu nhiên

từ đa xử lý nhập Nhóm

 

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[arg1, arg2, arg3]:

   # khối trong giây lát

    ngủ[ngẫu nhiên[]]

   # giá trị báo cáo

    in[f'Nhiệm vụ {arg1}, . ', xả=True]

    # trả về kết quả

    return arg1 + arg2 + arg3

 

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

if __name__ == '__main__'.

    # tạo nhóm quy trình

    với Hồ bơi[] as pool:

        # chuẩn bị lập luận

        args = [[i, i*2, i*3] for i in range[10]]

        # đưa ra nhiều nhiệm vụ, mỗi nhiệm vụ có nhiều đối số

        kết quả = nhóm. sơ đồ sao[nhiệm vụ, args]

Chạy ví dụ trước tiên sẽ tạo nhóm quy trình

Các đối số cho các tác vụ được chuẩn bị dưới dạng danh sách các bộ dữ liệu. Danh sách chứa 10 bộ dữ liệu cho 10 lệnh gọi hàm đích và mỗi bộ chứa 3 giá trị cho 3 đối số cho mỗi lệnh gọi hàm task[]

Các tác vụ thực thi và báo cáo các đối số của chúng, xác nhận rằng nhiều đối số đã được cung cấp như dự định và các tác vụ đã thực thi thành công

Cuối cùng, tất cả các tác vụ đã hoàn thành và một giá trị trả về có thể lặp lại được trả về quy trình chính

1

2

3

4

5

6

7

8

9

10

Nhiệm vụ 2, 4, 6

Nhiệm vụ 3, 6, 9

Nhiệm vụ 0, 0, 0

Nhiệm vụ 7, 14, 21

Nhiệm vụ 1, 2, 3

Nhiệm vụ 4, 8, 12

Nhiệm vụ 6, 12, 18

Nhiệm vụ 5, 10, 15

Nhiệm vụ 8, 16, 24

Nhiệm vụ 9, 18, 27

Tiếp theo, chúng ta sẽ khám phá cách chúng ta có thể gọi map[] và giải nén nhiều đối số trong hàm mục tiêu

Choáng ngợp trước các API đồng thời của python?
Để tìm sự giải thoát, hãy tải xuống Bản đồ tư duy về đồng thời Python MIỄN PHÍ của tôi

Nhiều đối số với Pool. map[] và giải nén đối số

Chúng ta có thể khám phá cách sửa đổi hàm mục tiêu để nó nhận một đối số duy nhất và sau đó giải nén đối số đơn lẻ này thành nhiều đối số

Hàm map[] sau đó có thể được gọi trực tiếp với một đối số duy nhất cho mỗi lần gọi hàm đích

Cách tiếp cận này yêu cầu chức năng mục tiêu có thể được sửa đổi

Đầu tiên, chúng ta có thể cập nhật hàm task[] từ các ví dụ trước để lấy một đối số thay vì nhiều đối số

Đối số duy nhất có thể là một danh sách hoặc một bộ gồm nhiều đối số

Sau đó, trong dòng đầu tiên của hàm, nó giải nén một đối số thành 3 đối số

Hàm task[] được cập nhật với thay đổi này được liệt kê bên dưới

1

2

3

4

5

6

7

8

9

10

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[args]:

   # đối số giải nén

    arg1, arg2, arg3 = args

   # khối trong giây lát

    ngủ[ngẫu nhiên[]]

   # giá trị báo cáo

    in[f'Nhiệm vụ {arg1}, . ', xả=True]

    # trả về kết quả

    return arg1 + arg2 + arg3

Sau đó, chúng ta có thể chuẩn bị một danh sách các bộ làm đối số cho hàm tác vụ, như chúng ta đã làm trước đây cho hàm starmap[]

Mỗi mục tuple trong danh sách đại diện cho một cuộc gọi đến chức năng mục tiêu với một đối số

Ví dụ

1

2

3

.. .

# chuẩn bị luận cứ

args = [[i, i*2, i*3] for i in range[10]]

Sau đó, chúng ta có thể gọi trực tiếp hàm multiprocessing pool map[]

1

2

3

.. .

# phát hành nhiều tác vụ, mỗi tác vụ có nhiều đối số

kết quả = nhóm. bản đồ[nhiệm vụ, args]

Liên kết điều này lại với nhau, ví dụ hoàn chỉnh được liệt kê bên dưới

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

#Trăn Siêu Nhanh. com

# ví dụ về nhiều đối số với pool. lập bản đồ và giải nén đối số

từ thời gian nhập ngủ

từ ngẫu nhiên nhập ngẫu nhiên

từ đa xử lý nhập Nhóm

 

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[args]:

   # đối số giải nén

    arg1, arg2, arg3 = args

   # khối trong giây lát

    ngủ[ngẫu nhiên[]]

   # giá trị báo cáo

    in[f'Nhiệm vụ {arg1}, . ', xả=True]

    # trả về kết quả

    return arg1 + arg2 + arg3

 

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

if __name__ == '__main__'.

    # tạo nhóm quy trình

    với Hồ bơi[] as pool:

        # chuẩn bị lập luận

        args = [[i, i*2, i*3] for i in range[10]]

        # đưa ra nhiều nhiệm vụ, mỗi nhiệm vụ có nhiều đối số

        kết quả = nhóm. bản đồ[nhiệm vụ, args]

Chạy ví dụ trước tiên sẽ tạo nhóm quy trình

Các đối số cho các tác vụ được chuẩn bị dưới dạng danh sách các bộ dữ liệu. Danh sách chứa 10 bộ dữ liệu cho 10 lệnh gọi hàm đích và mỗi bộ chứa 3 giá trị cho 3 giá trị sẽ được giải nén trong hàm task[]

Mỗi lệnh gọi đến hàm task[] nhận một đối số tuple duy nhất. Điều này sau đó được giải nén thành ba đối số, sau đó hàm thực thi bình thường, chặn, báo cáo một thông báo, sau đó trả về một giá trị kết hợp ba đối số

Cuối cùng, tất cả các tác vụ đã hoàn thành và một giá trị trả về có thể lặp lại được trả về quy trình chính

1

2

3

4

5

6

7

8

9

10

Nhiệm vụ 1, 2, 3

Nhiệm vụ 0, 0, 0

Nhiệm vụ 7, 14, 21

Nhiệm vụ 8, 16, 24

Nhiệm vụ 5, 10, 15

Nhiệm vụ 3, 6, 9

Nhiệm vụ 2, 4, 6

Nhiệm vụ 9, 18, 27

Nhiệm vụ 6, 12, 18

Nhiệm vụ 4, 8, 12

Tiếp theo, chúng ta sẽ khám phá cách sử dụng cuộc gọi Pool. map[] với hàm bao bọc sẽ giải nén một bộ đối số và gọi hàm đích có nhiều đối số

Nhiều đối số với Pool. map[] và hàm Wrapper

Chúng ta có thể khám phá cách gọi map[] để thực thi hàm mục tiêu một cách gián tiếp bằng một hàm bao bọc sẽ giải nén nhiều đối số cho chúng ta

Cách tiếp cận này cho phép chúng tôi sử dụng Pool. map[] và để nguyên chức năng tác vụ mục tiêu của chúng ta

Đầu tiên, chúng ta có thể định nghĩa hàm task[] nhận ba đối số, chặn một lúc, báo cáo một thông báo sau đó trả về một giá trị trả về

1

2

3

4

5

6

7

8

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[arg1, arg2, arg3]:

   # khối trong giây lát

    ngủ[ngẫu nhiên[]]

   # giá trị báo cáo

    in[f'Nhiệm vụ {arg1}, . ', xả=True]

    # trả về kết quả

    return arg1 + arg2 + arg3

Sau đó, chúng ta có thể xác định hàm bao bọc sẽ được gọi bởi map[]

Hàm này nhận một tập hợp các đối số như danh sách hoặc bộ

Sau đó, hàm giải nén các đối số này và gọi hàm đích, thêm một mức độ gián tiếp giữa map[] nhận một đối số cho mỗi tác vụ và hàm đích trong trường hợp này yêu cầu ba đối số

Chúng ta có thể giải nén các đối số theo cách thủ công và sau đó gọi hàm

Ví dụ

1

2

3

4

5

6

# chức năng bao bọc cho tác vụ

def task_wrapper[args]:

   # đối số giải nén

    arg1, arg2, arg3 = args

    # gọi hàm mục tiêu

    nhiệm vụ[arg1, arg2, arg3]

Tuy nhiên, điều này có thể đạt được trong một dòng bằng cách sử dụng toán tử dấu sao [*] để giải nén các đối số trong lệnh gọi hàm đích

Ví dụ

1

2

3

4

# chức năng bao bọc cho tác vụ

def task_wrapper[args]:

    # gọi task[] và giải nén các đối số

    trả lại nhiệm vụ[*args]

Sau đó, chúng ta có thể chuẩn bị các đối số dưới dạng danh sách các bộ dữ liệu, như chúng ta đã làm trước đây, sau đó sử dụng hàm map[] để gọi hàm bao bọc

1

2

3

4

5

6

7

.. .

# tạo nhóm quy trình

với Nhóm[] như pool:

    # chuẩn bị đối số

    args = [[i, i*2, i*3] for i in range[10]]

    # đưa ra nhiều nhiệm vụ, mỗi nhiệm vụ có nhiều đối số

    kết quả = nhóm. map[task_wrapper, args]

Liên kết điều này lại với nhau, ví dụ hoàn chỉnh được liệt kê bên dưới

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

#Trăn Siêu Nhanh. com

# ví dụ về nhiều đối số với pool. chức năng bản đồ và trình bao bọc

từ thời gian nhập ngủ

từ ngẫu nhiên nhập ngẫu nhiên

từ đa xử lý nhập Nhóm

 

# chức năng nhiệm vụ được thực thi trong một tiến trình worker con

def nhiệm vụ[arg1, arg2, arg3]:

   # khối trong giây lát

    ngủ[ngẫu nhiên[]]

   # giá trị báo cáo

    in[f'Nhiệm vụ {arg1}, . ', xả=True]

    # trả về kết quả

    return arg1 + arg2 + arg3

 

# chức năng bao bọc cho tác vụ

def task_wrapper[args]:

    # gọi task[] và giải nén các đối số

    trả lại nhiệm vụ[*args]

 

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

if __name__ == '__main__'.

    # tạo nhóm quy trình

    với Hồ bơi[] as pool:

        # chuẩn bị lập luận

        args = [[i, i*2, i*3] for i in range[10]]

        # đưa ra nhiều nhiệm vụ, mỗi nhiệm vụ có nhiều đối số

        kết quả = nhóm. map[task_wrapper, args]

Chạy ví dụ trước tiên sẽ tạo nhóm quy trình

Các đối số cho các tác vụ được chuẩn bị dưới dạng danh sách các bộ dữ liệu. Danh sách chứa 10 bộ cho 10 lần gọi hàm đích và mỗi bộ chứa 3 giá trị cho 3 giá trị sẽ được giải nén trong hàm task_wrapper[]

task_wrapper[] được gọi mỗi lần với một đối số, một bộ. Đến lượt nó gọi hàm task[] với các đối số đã giải nén

Mỗi lần gọi hàm task[] nhận cả ba đối số thực hiện bình thường, chặn, báo cáo một thông báo, sau đó trả về một giá trị kết hợp ba đối số

Cuối cùng, tất cả các tác vụ đã hoàn thành và một giá trị trả về có thể lặp lại được trả về quy trình chính

1

2

3

4

5

6

7

8

9

10

Nhiệm vụ 1, 2, 3

Nhiệm vụ 8, 16, 24

Nhiệm vụ 4, 8, 12

Nhiệm vụ 3, 6, 9

Nhiệm vụ 7, 14, 21

Nhiệm vụ 6, 12, 18

Nhiệm vụ 9, 18, 27

Nhiệm vụ 5, 10, 15

Nhiệm vụ 2, 4, 6

Nhiệm vụ 0, 0, 0

Đọ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ý — Xử lý song song dựa trên quy trình

hướng dẫn

  • Nhóm đa xử lý. Hướng dẫn hoàn chỉnh

Sách

  • Multiprocessing Pool Jump-Start, Jason Brownlee, 2022 [cuốn sách của tôi. ].  
  • Câu hỏi phỏng vấn API đa xử lý
  • Bảng gian lận API lớp Pool

Tôi cũng muốn giới thiệu các chương cụ thể từ những cuốn sách này

  • Python hiệu quả, Brett Slatkin, 2019
    • Nhìn thấy. Chương 7. Đồng thời và song song
  • Python hiệu suất cao, Ian Ozsvald và Micha Gorelick, 2020
    • Nhìn thấy. Chương 9. Mô-đun đa xử lý
  • Sơ lược về Python, Alex Martelli, et al. , 2017
    • Nhìn thấy. chương. 14. Chủ đề và quy trình

mang đi

Bây giờ bạn đã biết cách thực thi các hàm mục tiêu nhận nhiều đối số trong nhóm đa xử lý

Bản đồ có thể có bao nhiêu đối số?

map[] chiếm tối đa hai đối số . Tham số đầu tiên là hàm nào sẽ áp dụng cho từng phần tử. Đây là thông số bắt buộc. Tham số thứ hai là tùy chọn và được cung cấp chức năng được sử dụng làm từ khóa this.

Hàm bản đồ có thể có nhiều hơn 2 đối số không?

Bạn có thể chuyển bao nhiêu lần tùy thích vào hàm map[] trong Python .

Một hàm có thể có bao nhiêu đối số trong Python?

Trong Python, chúng ta có thể định nghĩa hai loại tham số có độ dài thay đổi. Chúng có thể được coi là các loại tham số tùy chọn đặc biệt. Nói cách khác, không có giới hạn về số lượng đối số được truyền cho tham số khi chúng ta gọi hàm này .

Một hàm có thể có 3 đối số không?

Chúng ta truyền đối số trong một hàm, chúng ta không thể truyền đối số nào cả, một đối số hoặc nhiều đối số cho một hàm và có thể gọi hàm .

Chủ Đề