cuốn sách gpt4 ai đã làm

python — Tại sao multiprocessing.Process có thể sửa đổi các hàm?

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 11:03:34 29 4
mua khóa gpt4 Nike

vì thế tôi đã đọcđâyChức năng trang trí không thể được ngâm. Thực ra:

nhập đa xử lý dưới dạng mp

trang trí def (f):
trình bao bọc def(*args, **kwargs):
thử:
f(*args, **kwargs)
ngoại trừ:
print 'Đã phát hiện ngoại lệ!'
giấy gói trả lại

@deco
định nghĩa f(x):
in x
tăng lỗi tràn

nếu __name__ == '__main__':
pool = mp.Pool(process=1)
cho _ trong pool.imap_unordered(f, range(10)):
vượt qua
pool.close()
pool.join()
in 'Tất cả đã xong'

Đầu ra:

Traceback (most recent call last):
Tệp "deco0.py", dòng 19, trong
cho _ trong pool.imap_unordered(f, range(10)):
Tệp "/Users/usualme/anaconda/lib/python2.7/multiprocessing/pool.py", dòng 659, ở phần tiếp theo
nâng cao giá trị
cPickle.PicklingError: Không thể chọn : tra cứu thuộc tính __buildin__.function không thành công

Nhưng bây giờ, nếu tôi sử dụng Quá trình 替换 bản đồ:

nhập đa xử lý dưới dạng mp

trang trí def (f):
trình bao bọc def(*args, **kwargs):
thử:
f(*args, **kwargs)
ngoại trừ:
print 'Đã phát hiện ngoại lệ!'
giấy gói trả lại

@deco
định nghĩa f(x):
in x
tăng lỗi tràn

nếu __name__ == '__main__':
p = mp.Process(target=f, args=(1,))
p.start()
p.join()
in 'Tất cả đã xong'

Đầu ra:

1
Đã bắt được ngoại lệ!
Tất cả đã xong

Tại sao nó hoạt động? Quá trình này không cần các chức năng trang trí dưa chua?

câu trả lời hay nhất

Điều này hoạt động vì bạn đang chạy trên Linux và không cần dưa chua f 以通过 Quá trình.__init__ Gọi nó trong quá trình con. Điều này là do f 通过 os.fork Được thừa kế bởi con. Nếu bạn chạy cùng mã trên Windows (thiếu cái nĩa) hoặc thử sử dụng f 传递给 Pool.apply/Bể bơi/bản đồ(Cả hai đều yêu cầu dưa chua f để gọi nó trong một tiến trình con), bạn sẽ gặp lỗi.

Cho dù bạn sử dụng nền tảng nào, ví dụ này sẽ không thành công:

nhập đa xử lý dưới dạng mp

trang trí def (f):
trình bao bọc def(*args, **kwargs):
thử:
f(*args, **kwargs)
ngoại trừ:
print 'Đã phát hiện ngoại lệ!'
giấy gói trả lại

@deco
định nghĩa f(x):
in x
tăng lỗi tràn

nếu __name__ == '__main__':
p = mp.Pool()
p.apply(f, args=(1,)) # f cần được chọn ở đây.
in 'Tất cả đã xong'

Đầu ra:

1
Đã bắt được ngoại lệ!
Ngoại lệ trong luồng Thread-2:
Traceback (most recent call last):
Tệp "/usr/lib/python2.7/threading.py", dòng 551, trong __bootstrap_inner
self.run()
Tệp "/usr/lib/python2.7/threading.py", dòng 504, đang chạy
self.__target(*self.__args, **self.__kwargs)
Tệp "/usr/lib/python2.7/multiprocessing/pool.py", dòng 319, trong _handle_tasks
đặt (nhiệm vụ)
PicklingError: Không thể chọn : tra cứu thuộc tính __buildin__.function không thành công

Giới thiệu về python - Tại sao multiprocessing.Process có thể sửa đổi các hàm? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/26280733/

29 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress