Biến chia sẻ đa xử lý Python

Bạn không xác định biến status ở bất kỳ đâu nên bạn không thể truy cập biến đó cho dù đó có phải là

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0 hay không. Có lẽ bạn có nghĩa là
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1, tôi. e. chuỗi ký tự
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2, không phải là một biến có tên là status

Ngoài ra, hãy xem các ví dụ trong tài liệu và có lẽ mã ở đây vì một số thứ khác trong mã của bạn bị tắt, ví dụ: đối tượng

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
4 bạn tạo phải được chuyển đến quy trình con/hàm dưới dạng đối số. Mặt khác, mã trong hàm không có cách nào để biết status là gì vì nó không được xác định trong phạm vi của hàm

Theo mặc định, mã chạy trong các quy trình khác nhau không chia sẻ cùng một dữ liệu. Tuy nhiên, mô-đun

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0 chứa các giá trị nguyên thủy để giúp chia sẻ các giá trị trên nhiều quy trình

import multiprocessing

plain_num = 0
shared_num = multiprocessing.Value['d', 0]
lock = multiprocessing.Lock[]

def increment[]:
    global plain_num
    with lock:
        # ordinary variable modifications are not visible across processes
        plain_num += 1
        # multiprocessing.Value modifications are
        shared_num.value += 1

ps = [multiprocessing.Process[target=increment] for n in range[4]]
for p in ps:
    p.start[]
for p in ps:
    p.join[]

print["plain_num is %d, shared_num is %d" % [plain_num, shared_num.value]]

# Out: plain_num is 0, shared_num is 4

Đa quy trình không thể chia sẻ các biến toàn cục. Dạy Bạn Bắt Đầu Với Python Một Trăm Sáu

Đa quy trình không thể chia sẻ biến toàn cục. Hai luồng con trong cùng một quy trình chính. Các luồng có thể chia sẻ các biến toàn cục của cùng một quy trình và các quy trình khác nhau, mỗi quy trình lưu một biến toàn cục và không chia sẻ các biến toàn cục.
Nhiều quy trình không thể chia sẻ các biến toàn cục
nhập hệ điều hành, đa xử lý, phân luồng

n = 100

kiểm tra độ chắc chắn [].
n toàn cầu
n += 1
print[ Giá trị của n trong 'test===={} là { . định dạng [hệ điều hành. getpid[], hex[id[n]]]]

def demo [].
n toàn cục
n += 1
print[ Giá trị của n trong 'demo===={} là { . định dạng [hệ điều hành. getpid[], hex[id[n]]]]

print[ phân luồng. current_thread[]. name]
test[] # 101
demo[] # 102

# Hai luồng con trong cùng một tiến trình chính. Chủ đề có thể chia sẻ các biến toàn cầu của cùng một quá trình

# t1 = phân luồng. Luồng [đích=kiểm tra]
# t2 = luồng. Chủ đề [mục tiêu=demo]
# t1. bắt đầu[]
# t2. bắt đầu[]

# nếu __name__ == '__main__'.
# Mỗi quy trình lưu một biến toàn cục và không chia sẻ các biến toàn cục
# p1 = đa xử lý. Quá trình [đích=kiểm tra]
# p2 = đa xử lý. Quy trình [mục tiêu=demo]
# p1. bắt đầu[] # 101
# p2. start[] # 101
Ví dụ.
từ Quy trình nhập đa xử lý
nhập hệ điều hành

số = [ 11 , 22 ]

def work1 [].
"""Mã được thực thi bởi tiến trình con"""
print[ "in process1 pid =%d , nums =%s" %[ . getpid[], nums ]]
for i in range[ 3 ].
số. nối thêm [ i ]
print[ "trong process1 pid =%d , nums =%s" %[ os. getpid[], nums]]

def work2 [].
"""Mã được thực thi bởi tiến trình con"""
nums. pop []
print[ "trong process2 pid =%d , nums =%s" %[ os. getpid[], nums]]

if __name__ == '__main__'.
p1 = Quy trình[mục tiêu=công việc1]
p1. bắt đầu[]
p1. tham gia[]

p2 = Quy trình[đích=công việc2]
p2. bắt đầu[]

print['in process0 pid={} ,nums={}'. định dạng [os. getpid[],nums]]
运行结果:
in process1 pid=2707 ,nums=[11, 22]
in process1 pid=2707 ,nums=[11, 22, 0]
in process1 pid=2707 ,nums=[11, 22, 0, 1]
in process1 pid=2707 ,nums=[11, 22, 0, 1, 2]
in process0 pid=2706 ,nums=[11, 22]
in process2 pid=2708 ,nums=[11]

Liên hệ chúng tôi

Hỗ trợ bán hàng

Trò chuyện trực tiếp với nhóm bán hàng của chúng tôi hoặc liên hệ với chuyên gia phát triển kinh doanh trong khu vực của bạn

Khi tôi đang sử dụng đa xử lý, tôi phát hiện ra rằng các biến toàn cục không được chia sẻ giữa các quy trình

Ví dụ về vấn đề

Trước tiên hãy để tôi cung cấp một ví dụ về vấn đề mà tôi đang gặp phải

Tôi có 2 danh sách đầu vào, 2 quy trình sẽ đọc từ đó và nối chúng vào danh sách cuối cùng và in danh sách tổng hợp ra thiết bị xuất chuẩn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import multiprocessing
final_list = []

input_list_one = ['one', 'two', 'three', 'four', 'five']
input_list_two = ['six', 'seven', 'eight', 'nine', 'ten']

def worker[data]:
    for item in data:
        final_list.append[item]

process1 = multiprocessing.Process[target=worker, args=[final_list_one]]
process2 = multiprocessing.Process[target=worker, args=[final_list_two]]

process1.start[]
process2.start[]
process1.join[]
process2.join[]

print[final_list]

Khi chạy ví dụ

1
2
$ python3 mp_list_issue.py
[]

Như bạn có thể thấy phản hồi từ danh sách vẫn còn trống

Nghị quyết

Chúng ta cần sử dụng đa xử lý. Người quản lý. Danh sách

Từ Tài liệu của Python

“_______17 trả về một đối tượng SyncManager đã bắt đầu có thể được sử dụng để chia sẻ các đối tượng giữa các quy trình. Đối tượng trình quản lý được trả về tương ứng với một quy trình con được sinh ra và có các phương thức sẽ tạo các đối tượng được chia sẻ và trả về các proxy tương ứng. ”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import multiprocessing
manager = multiprocessing.Manager[]
final_list = manager.list[]

input_list_one = ['one', 'two', 'three', 'four', 'five']
input_list_two = ['six', 'seven', 'eight', 'nine', 'ten']

def worker[data]:
    for item in data:
        final_list.append[item]

process1 = multiprocessing.Process[target=worker, args=[final_list_one]]
process2 = multiprocessing.Process[target=worker, args=[final_list_two]]

process1.start[]
process2.start[]
process1.join[]
process2.join[]

print[final_list]

Bây giờ khi chúng tôi chạy tập lệnh của mình, chúng tôi có thể thấy rằng các quy trình của chúng tôi biết về danh sách đã xác định của chúng tôi

1
2
$ python3 mp_list.py
['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']

Cảm ơn

Vui lòng thể hiện sự ủng hộ bằng cách chia sẻ bài đăng này, quyên góp, đăng ký hoặc liên hệ với tôi nếu bạn muốn tôi giới thiệu và viết về bất kỳ chủ đề công nghệ cụ thể nào

Làm cách nào để chia sẻ biến toàn cục trong Python đa xử lý?

Bạn có thể chia sẻ một biến toàn cầu với tất cả các quy trình worker con trong nhóm đa xử lý bằng cách xác định nó trong hàm khởi tạo quy trình worker .

Hai quy trình có thể chia sẻ các biến toàn cục không?

Không, vì các biến toàn cục không được chia sẻ giữa các quy trình trừ khi một số cơ chế IPC được triển khai . Không gian bộ nhớ sẽ được sao chép. Kết quả là, biến toàn cục trong cả hai quy trình sẽ có cùng giá trị ngay sau khi rẽ nhánh, nhưng nếu một thay đổi thì biến kia sẽ không thấy nó thay đổi.

Đa xử lý có chia sẻ bộ nhớ không?

shared_memory — Bộ nhớ dùng chung để truy cập trực tiếp giữa các quy trình . Mới trong phiên bản 3. 8. Mô-đun này cung cấp một lớp, SharedMemory, để phân bổ và quản lý bộ nhớ dùng chung được truy cập bởi một hoặc nhiều quy trình trên máy đa xử lý hoặc đa xử lý đối xứng [SMP].

Giá trị đa xử lý trong Python là gì?

Đa xử lý. Lớp giá trị được dùng để chia sẻ một loại ctype đã cho giữa nhiều quy trình . đa xử lý. Lớp mảng được sử dụng để chia sẻ một mảng ctypes của một loại nhất định giữa nhiều quy trình. Cả hai lớp Giá trị và Mảng đều là bí danh cho các lớp trong đa xử lý.

Chủ Đề