Nhóm đa xử lý làm gì trong python?

Giải pháp tốt nhất cho vấn đề của bạn là sử dụng một

PicklingError: Can't pickle : it's not the same object as __main__.scientists
0. Sử dụng
PicklingError: Can't pickle : it's not the same object as __main__.scientists
1 và có chức năng "cấp dữ liệu hàng đợi" riêng biệt có lẽ là quá mức cần thiết

Đây là phiên bản chương trình của bạn được sắp xếp lại một chút, lần này chỉ có 2 quy trình được san bằng trong một

PicklingError: Can't pickle : it's not the same object as __main__.scientists
0. Tôi tin rằng đó là cách dễ nhất để thực hiện, với những thay đổi tối thiểu đối với mã gốc

import multiprocessing
import time

data = [
    ['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'],
    ['e', '1'], ['f', '3'], ['g', '5'], ['h', '7']
]

def mp_worker[[inputs, the_time]]:
    print " Processs %s\tWaiting %s seconds" % [inputs, the_time]
    time.sleep[int[the_time]]
    print " Process %s\tDONE" % inputs

def mp_handler[]:
    p = multiprocessing.Pool[2]
    p.map[mp_worker, data]

if __name__ == '__main__':
    mp_handler[]

Lưu ý rằng hàm

PicklingError: Can't pickle : it's not the same object as __main__.scientists
3 hiện chấp nhận một đối số duy nhất [một bộ trong số hai đối số trước đó] vì hàm
PicklingError: Can't pickle : it's not the same object as __main__.scientists
4 chia dữ liệu đầu vào của bạn thành các danh sách con, mỗi danh sách con được cung cấp dưới dạng một đối số duy nhất cho hàm worker của bạn

Trong bài học này, bạn sẽ tìm hiểu sâu hơn về cách bạn có thể sử dụng

PicklingError: Can't pickle : it's not the same object as __main__.scientists
5. Nó tạo ra nhiều quy trình Python trong nền và phân bổ các tính toán cho bạn trên nhiều lõi CPU để tất cả chúng diễn ra song song mà bạn không cần phải làm gì

Bạn sẽ nhập mô-đun

PicklingError: Can't pickle : it's not the same object as __main__.scientists
6 để thêm một số hoạt động ghi nhật ký khác vào chức năng
PicklingError: Can't pickle : it's not the same object as __main__.scientists
7 của mình để bạn có thể xem những gì đang diễn ra đằng sau hậu trường. Bạn sẽ sử dụng
PicklingError: Can't pickle : it's not the same object as __main__.scientists
8 để xem quy trình nào đang hoạt động trên bản ghi nào, vì vậy, bạn sẽ có thể thấy rằng các quy trình giống nhau đang hoạt động trên các dữ liệu khác nhau trong các đợt khác nhau. Bạn thậm chí có thể đặt số lượng quy trình bạn muốn làm việc cùng một lúc

00. 00 Bây giờ, những gì đang xảy ra ở đây?

00. 24

PicklingError: Can't pickle : it's not the same object as __main__.scientists
0 chúng tôi nhận được hoàn toàn giống nhau.
PicklingError: Can't pickle : it's not the same object as __main__.scientists
5 quạt ra và thực hiện tất cả các tính toán này cho chúng tôi, áp dụng hàm
PicklingError: Can't pickle : it's not the same object as __main__.scientists
7, sau đó trả lại kết quả và lắp ráp cấu trúc dữ liệu đầu ra này, tại đây, vì vậy chúng tôi nhận được kết quả chính xác như vậy, tại đây, điều này khá tuyệt

00. 46 Bây giờ, có một vài tham số nữa chúng ta có thể điều chỉnh ở đây và tôi thực sự muốn đảm bảo rằng bạn thấy những gì đang diễn ra đằng sau hậu trường ở đây. Điều đầu tiên chúng ta sẽ làm là bổ sung thêm một số nhật ký vào chức năng

PicklingError: Can't pickle : it's not the same object as __main__.scientists
7 này để chúng ta có thể xem điều gì đang diễn ra đằng sau hậu trường

01. 00 Để làm được điều đó, tôi sẽ nhập mô-đun

PicklingError: Can't pickle : it's not the same object as __main__.scientists
6. Sau đó, tại đây, chúng ta có thể in ra số quy trình hoặc một số mã định danh cho

01. 11 quy trình hiện tại. Chúng ta có thể làm điều đó với chức năng

PicklingError: Can't pickle : it's not the same object as __main__.scientists
5 [lấy ID tiến trình]

01. 17 Chúng ta có thể nói

PicklingError: Can't pickle : it's not the same object as __main__.scientists
6—tên của quy trình đang xử lý hồ sơ này, và sau đó chúng ta có thể nói
PicklingError: Can't pickle : it's not the same object as __main__.scientists
7
PicklingError: Can't pickle : it's not the same object as __main__.scientists
8 […]

01. 31 Và bây giờ, nếu tôi chạy lại chương trình này, chúng ta sẽ nhận được một số kết quả mở rộng hơn ở đây. Vì vậy, mỗi quá trình diễn ra song song, nó sẽ nhận được một số nhận dạng duy nhất

01. 41 Và chúng ta có thể thấy ở đây cách

PicklingError: Can't pickle : it's not the same object as __main__.scientists
5 trải rộng các tính toán của chúng ta trên nhiều lõi. Vì vậy, những gì bạn có thể thấy ở đây là chúng tôi có bốn quy trình này, bạn biết đấy,
if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
0 đến
if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
1,

01. 58 và họ đang làm việc song song với nhau. Và sau đó, chúng được tái sử dụng. Vì vậy, trong đợt thứ hai, các quy trình tương tự—một lần nữa—đang làm việc trên các dữ liệu khác. Và chúng ta có thể tác động đến hành vi này, vì vậy, chúng ta thực sự có thể đặt giới hạn và nói, “Chà, tôi chỉ muốn quy trình

if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
2 trong
if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
3 này ở đây. ” Và khi tôi chạy lại cái này, bạn có thể thấy ở đây, vâng, bây giờ chúng tôi có một quy trình duy nhất đang thực hiện tất cả các tính toán. Và một lần nữa, chúng ta sẽ kết thúc với thời gian chạy bảy giây

02. 31 Nếu bạn nhìn vào nhật ký ở đây, bạn có thể thấy chính xác rằng đó là cùng một quy trình xử lý từng bản ghi một và không có tính toán song song nào xảy ra. Và bây giờ, nếu tôi cải tiến điều này, tôi có thể nói, “Chà, chúng tôi muốn các quy trình

if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
4. ” Bây giờ, nếu chúng tôi chạy lại chương trình này, chúng tôi có hai quy trình hoạt động song song và chúng đang xử lý các bản ghi này song song, và bây giờ chúng tôi sẽ tăng tốc một chút

02. 54 Và, tất nhiên, tôi có thể phát điên ở đây và tôi thực sự có thể nói, được rồi, tôi muốn có một quy trình cho mỗi bản ghi ở đây. Số lượng quy trình phải là số lượng bản ghi trong thứ này ở đây và theo cách đó chúng tôi có thể xử lý tất cả chúng song song và chúng tôi thực sự có thể cắt giảm thời gian để hoàn thành xuống còn một giây, tức là khoảng thời gian cần thiết để

03. 21 Và bạn biết đấy, tất nhiên, đây là một ví dụ về học thuật, hoặc chỉ là một ví dụ về đồ chơi, bởi vì—à, chúng tôi chỉ đang ngủ ở đây, nên thực sự không có gì thú vị lắm đang diễn ra

03. 31 Nhưng nếu bạn tưởng tượng rằng đây là một cuộc gọi đang chờ trên I\O hoặc đang chờ quá trình tải xuống trang web hoàn tất—nếu đây là một loại công cụ quét web—bạn có thể thực hiện tất cả những điều này song song và với

03. 52 hoặc nhiều lõi CPU và bạn có rất nhiều sự linh hoạt trong việc định cấu hình nó. Có các tùy chọn khác ở đây. Ví dụ: chúng ta có thể nói, “Được rồi, tôi muốn các quy trình

if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
4,” và có một cài đặt khác có tên là
if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
7 [tác vụ tối đa cho mỗi đứa trẻ] và tôi có thể nói, “Chà, tôi muốn các quy trình
if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
4 song song và tôi muốn quy trình . " Vì thế,

04. 18 nếu bạn chạy cái này, chúng ta sẽ nhận được một kết quả hơi khác ở đây. Một lần nữa, nếu chúng tôi xem ID quy trình, bạn có thể thấy ở đây, được rồi, chúng tôi đang bắt đầu với

if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]
9,
PicklingError: Can't pickle : it's not the same object as __main__.scientists
50 và những mã này đang thực hiện một số xử lý

04. 30 Và sau đó, chúng tôi nhận được hai quy trình hoàn toàn mới đang xử lý các phần tử tiếp theo, sau đó chúng tôi lại nhận được hai quy trình hoàn toàn mới, v.v.

04. 38 Với

PicklingError: Can't pickle : it's not the same object as __main__.scientists
5, bạn thực sự có thể tác động đến cách nó phân phối các tính toán của bạn trên nhiều lõi CPU. Tất nhiên, bạn cũng có thể bỏ qua các cài đặt này và những gì nó sẽ thực hiện sau đó—nó sẽ sinh ra nhiều quy trình như bạn có lõi CPU

04. 58 Vì vậy, tôi đang sử dụng lõi kép với máy siêu phân luồng mà Python coi là CPU lõi tứ và điều đó có nghĩa là nó sẽ sinh ra bốn quy trình riêng biệt để tối đa hóa CPU mà tôi có sẵn

Michal vào tháng 8. 5, 2019

Trên máy Windows của tôi, tôi phải chuyển mã cấp cao nhất sang hàm main[], nếu không thì tôi đã gặp phải lỗi này

Michal vào tháng 8. 5, 2019

Cập nhật. Ngoài ra, tập lệnh hoạt động tốt sau khi di chuyển mã cấp cao nhất vào khối

PicklingError: Can't pickle : it's not the same object as __main__.scientists
52, tôi. e. mà không cần xác định hàm
PicklingError: Can't pickle : it's not the same object as __main__.scientists
53

Nhưng không phải là mã cấp cao nhất đơn giản mà chúng ta có thể thấy trong video

DS vào tháng 1. 12, 2020

Không thể song song hóa chức năng giảm do bộ tích lũy cần được chia sẻ trên nhiều quy trình? . Bi-a không có chức năng rút gọn trái ngược với bản đồ?

Dan Bader Nhóm RP vào tháng 1. 12, 2020

@Diwanshu

Không thể song song hóa chức năng giảm do bộ tích lũy cần được chia sẻ trên nhiều quy trình?

Đúng, tôi muốn nói điều đó chính xác. Có thể thực hiện song song bước rút gọn tùy thuộc vào trường hợp sử dụng chính xác [và bạn có thể thực hiện bằng cách chia nhỏ công việc theo cách thủ công và xử lý nó bằng một

PicklingError: Can't pickle : it's not the same object as __main__.scientists
5 khác] nhưng không có triển khai chung về giảm song song mà mô-đun
PicklingError: Can't pickle : it's not the same object as __main__.scientists
55 cung cấp

somanathsankaran vào ngày 30 tháng 3 năm 2020

Tôi đã thực hiện một số thử nghiệm với đa xử lý. Có phải số lượng quy trình phải bằng số lõi trong máy của chúng tôi không, nhưng khi tôi thử nghiệm không có quy trình nào nhiều hơn số lõi thì kết quả đầu ra rất nhanh, nhưng tôi có một câu hỏi là cách này đưa ra nhiều quy trình hơn số lượng lõi

Sid vào ngày 31 tháng 3 năm 2020

Tôi đang thử nghiệm với hàm bình phương đơn giản như thế này

PicklingError: Can't pickle : it's not the same object as __main__.scientists
9

Sử dụng bản đồ thông thường thì mất 0. 0102119445801 giây, trong khi bản đồ nhóm đa xử lý cần 0. 0106949806213 giây

Tại sao đa xử lý. Pool[] chậm hơn một chút trong trường hợp này?

Jim Anderson Nhóm RP vào ngày 31 tháng 3 năm 2020

Sid - Sự chậm lại trên nhóm đa xử lý có thể là do một số điều. Về cơ bản, việc quay vòng các quy trình cần có thời gian và việc truyền dữ liệu đến và đi từ các quy trình này tương đối chậm. Thời gian cần thiết để chuyển

PicklingError: Can't pickle : it's not the same object as __main__.scientists
56 từ một quy trình sang quy trình worker có thể dài hơn thời gian cần thiết để tính toán
PicklingError: Can't pickle : it's not the same object as __main__.scientists
57. [Mình chưa đo nên không biết chính xác]

Nếu bạn làm cho chức năng của mình chuyên sâu hơn về tính toán, bạn có thể sẽ thấy nhóm đa xử lý hoạt động tốt hơn

Hi vọng điêu nay co ich. jim

Rombituon vào ngày 1 tháng 4 năm 2020

Xin chào, tôi thử chạy mã nhưng gặp lỗi như

PicklingError: Can't pickle : it's not the same object as __main__.scientists

bạn còn ý kiến ​​nào không?

Rombituon vào ngày 1 tháng 4 năm 2020

Xin chào, xin lỗi, đã giải quyết. đó là vì têntuple của tôi

ngựa vằn thân thiện vào ngày 17 tháng 4 năm 2020

đa xử lý là tuyệt vời, nhưng hãy lưu ý, nếu chức năng chuyển đổi của bạn không thành công, bạn phải viết mã nhiều thứ hơn để có quyền truy cập vào stacktrace…

Chris James vào ngày 20 tháng 4 năm 2020

Trên Python 3. 8, tôi cần thay đổi mã này

if __name__ == '__main__':
    with multiprocessing.Pool[] as pool:
        start = time.monotonic[]
        result = pool.map[transform, scientists]
        end = time.monotonic[]
        print[f"Time taken: {end - start:.2f}"]
        pprint.pprint[result]

Nhóm cần được thiết lập trước khi bạn có thể sử dụng nó, cách dễ nhất là sử dụng trình quản lý ngữ cảnh, nếu không, bạn cũng sẽ gặp lỗi khởi động trên Mac/Linux

Cố gắng chạy mã trong Jupyter Notebook sẽ bế tắc, không hoàn toàn chắc chắn tại sao, Jupyter và đa xử lý không thực sự hoạt động cùng nhau

[

PicklingError: Can't pickle : it's not the same object as __main__.scientists
58 luôn cung cấp cho bạn kết quả chính xác với kiểu sử dụng này, ngay cả khi đồng hồ hệ thống bị hỏng giữa các lần đọc. Hữu ích cho mã sản xuất. ]

Zarata vào ngày 7 tháng 5 năm 2020

Chà, thật bất ngờ… video giữa đặt kích thước nhóm thành 7 led hoàn thành ~1 giây. Tuy nhiên, sau đó các lõi có sẵn được hiển thị là 4. Tôi đã nghĩ rằng nhóm quản lý 1 luồng trên mỗi lõi, một quy trình trên mỗi luồng, vì vậy mặc dù kích thước nhóm lớn, tôi nghĩ rằng vấn đề sẽ xảy ra với lõi, tôi. e. thời gian sẽ là ~2. Vì vậy, nhóm tạo 7 luồng, [tôi thấy CÓ bảy PIDS], xử lý 7 luồng trên 4 lõi và HĐH tiếp quản việc quản lý nhiều luồng đồng thời trên một số lõi đơn?

Varun Vaddiparty vào ngày 11 tháng 5 năm 2020

Ai đó có thể làm rõ chuyện gì xảy ra với số lượng quy trình nhiều hơn số lượng lõi không. Trong trường hợp đó, làm thế nào để tất cả các quy trình chạy cùng một lúc và kết thúc sau 1 giây

Zarata vào ngày 11 tháng 5 năm 2020

Tôi nghĩ rằng nó bắt đầu được trả lời trong một hướng dẫn sau. Có hai loại pool khác nhau trong gói Futures. Chủ đề và quy trình. Hợp đồng tương lai có một số điểm tương đồng với gói đa xử lý và do đó những gì được tiết lộ ở đó có thể có một số liên quan ở đây. Ít nhất, nó khiến tôi nghĩ xa hơn. Tôi đề nghị. Các hàm transform[] được sử dụng ở đây [và trong tương lai Futures. ] ] chỉ chứa một "ngủ[1]", vì vậy mỗi tác vụ rất giống với một tác vụ theo chuỗi và mỗi tác vụ phần lớn bao gồm một khoảng thời gian giữ không làm gì cả - hệ điều hành đang ngừng chờ đợi. Bằng cách nào đó, nhóm ở đây trong đa xử lý đang hợp tác với HĐH và biết “đã khởi chạy một luồng, nó đang bị tạm dừng, không có CPU nào được sử dụng, tôi có thể khởi chạy một luồng khác,…” để cuối cùng có 7 luồng ở đó. Tôi không thể nói làm thế nào chúng thực sự được phân phối trên các lõi, nhưng tất cả chúng đều được giữ và chờ đợi. Sau đó, sau 1 giây. , HĐH bắt đầu bỏ chờ các luồng, tất cả có thể tuần tự, nhưng có thể được phân chia giữa các lõi; . Ngoài thời gian chờ đợi “khủng”, rất ít thời gian được sử dụng. Vì vậy, các chủ đề dọn sạch, và tổng exec. chỉ là ~1. 00 giây

Bến vào tháng 10. 22, 2020

Sau khi di chuyển mọi thứ vào một chức năng chính và thêm một

PicklingError: Can't pickle : it's not the same object as __main__.scientists
5

chặn ở dưới cùng, tôi tiếp tục gặp lỗi

PicklingError: Can't pickle : it's not the same object as __main__.scientists
6

Giải pháp là di chuyển định nghĩa của hàm biến đổi,

PicklingError: Can't pickle : it's not the same object as __main__.scientists
59 và vị trí mà tôi đã xác định biến
PicklingError: Can't pickle : it's not the same object as __main__.scientists
60 bên ngoài hàm
PicklingError: Can't pickle : it's not the same object as __main__.scientists
53

Nhóm đa xử lý hoạt động như thế nào trong Python?

Đa xử lý Python. Lớp Pool và Process . Sau khi thực thi mã, nó trả về đầu ra ở dạng danh sách hoặc mảng. Nó đợi tất cả các tác vụ hoàn thành và sau đó trả về đầu ra. It maps the input to the different processors and collects the output from all the processors. After the execution of code, it returns the output in form of a list or array. It waits for all the tasks to finish and then returns the output.

Việc sử dụng đa xử lý trong Python là gì?

Đa xử lý trong Python là gói tích hợp sẵn cho phép hệ thống chạy nhiều quy trình đồng thời . Nó sẽ cho phép chia các ứng dụng thành các luồng nhỏ hơn có thể chạy độc lập.

Làm cách nào để sử dụng nhóm trong Python?

Nhóm đa xử lý Python. Hướng dẫn đầy đủ .
Tạo nhóm quy trình
Gửi nhiệm vụ đến Nhóm quy trình
Đợi nhiệm vụ hoàn thành [Tùy chọn]
Tắt nhóm quy trình

Bản đồ nhóm đa xử lý trả về cái gì?

Hàm map[] trả về một giá trị trả về có thể lặp lại từ hàm đích , trong khi hàm map_async[] trả về AsyncResult. Hàm map[] không hỗ trợ các hàm gọi lại, trong khi hàm map_async[] có thể thực thi các hàm gọi lại trên các giá trị trả về và lỗi.

Chủ Đề