frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
96
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
97
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
96
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
99
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
96
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
6 cũng giới thiệu các API không có tương tự trong mô-đun
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
0. Một ví dụ điển hình của điều này là đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5 cung cấp một phương tiện thuận tiện để song song hóa việc thực thi một hàm trên nhiều giá trị đầu vào, phân phối dữ liệu đầu vào qua các quy trình (song song hóa dữ liệu). Ví dụ sau minh họa cách thực hành phổ biến để xác định các chức năng như vậy trong một mô-đun để các quy trình con có thể nhập thành công mô-đun đó. Ví dụ cơ bản này về tính song song dữ liệu bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
7 cung cấp giao diện cấp cao hơn để đẩy các tác vụ sang quy trình nền mà không chặn thực thi quy trình gọi. So với việc sử dụng trực tiếp giao diện
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5, API
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
9 dễ dàng hơn cho phép tách biệt việc gửi công việc đến nhóm quy trình cơ bản khỏi việc chờ đợi kết quả
Lớp from multiprocessing import Process, Pipe
def f(conn):
conn.send([42, None, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print(parent_conn.recv()) # prints "[42, None, 'hello']"
p.join()
0¶
6, các quy trình được sinh ra bằng cách tạo một đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 và sau đó gọi phương thức
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
3 của nó.
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 tuân theo API của
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
5. Một ví dụ nhỏ về chương trình đa xử lý là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5
Để hiển thị các ID quy trình riêng lẻ có liên quan, đây là một ví dụ mở rộng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
6
Để biết giải thích về lý do tại sao phần
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
6 hỗ trợ ba cách để bắt đầu một quy trình. Các phương thức bắt đầu này là
đẻ trứng
Quá trình mẹ bắt đầu một quá trình phiên dịch Python mới. Tiến trình con sẽ chỉ kế thừa những tài nguyên cần thiết để chạy phương thức
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
8 của đối tượng tiến trình. Cụ thể, các bộ mô tả và xử lý tệp không cần thiết từ quy trình gốc sẽ không được kế thừa. Bắt đầu một quy trình bằng phương pháp này khá chậm so với sử dụng fork hoặc forkserver
Có sẵn trên Unix và Windows. Mặc định trên Windows và macOS
cái nĩa
Quá trình mẹ sử dụng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
9 để rẽ nhánh trình thông dịch Python. Tiến trình con, khi nó bắt đầu, thực sự giống với tiến trình cha. Tất cả các tài nguyên của cha mẹ được kế thừa bởi tiến trình con. Lưu ý rằng việc rẽ nhánh một cách an toàn một quy trình đa luồng là một vấn đề
Chỉ khả dụng trên Unix. Mặc định trên Unix
máy chủ rẽ nhánh
Khi chương trình bắt đầu và chọn phương thức khởi động máy chủ rẽ nhánh, một quy trình máy chủ sẽ được bắt đầu. Từ đó trở đi, bất cứ khi nào cần một quy trình mới, quy trình mẹ sẽ kết nối với máy chủ và yêu cầu nó rẽ nhánh một quy trình mới. Quá trình máy chủ fork là một luồng đơn nên sẽ an toàn khi sử dụng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
9. Không có tài nguyên không cần thiết được kế thừa
Có sẵn trên các nền tảng Unix hỗ trợ chuyển bộ mô tả tệp qua các đường ống Unix
Đã thay đổi trong phiên bản 3. 8. Trên macOS, phương thức bắt đầu sinh sản hiện là mặc định. Phương pháp bắt đầu ngã ba nên được coi là không an toàn vì nó có thể dẫn đến sự cố của quy trình con. Xem bpo-33725.
Đã thay đổi trong phiên bản 3. 4. được thêm sinh sản trên tất cả các nền tảng Unix và thêm máy chủ phân nhánh cho một số nền tảng Unix. Các tiến trình con không còn kế thừa tất cả các xử lý có thể kế thừa của cha mẹ trên Windows.
Trên Unix, việc sử dụng các phương thức khởi động spawn hoặc forkserver cũng sẽ bắt đầu một quy trình theo dõi tài nguyên theo dõi các tài nguyên hệ thống được đặt tên chưa được liên kết (chẳng hạn như các semaphores được đặt tên hoặc các đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
21) được tạo bởi các quy trình của chương trình. Khi tất cả các quy trình đã thoát, trình theo dõi tài nguyên sẽ hủy liên kết mọi đối tượng được theo dõi còn lại. Thông thường sẽ không có, nhưng nếu một quá trình bị giết bởi một tín hiệu thì có thể có một số tài nguyên "bị rò rỉ". (Các semaphore bị rò rỉ cũng như các phân đoạn bộ nhớ dùng chung sẽ không được tự động hủy liên kết cho đến lần khởi động lại tiếp theo. Đây là vấn đề đối với cả hai đối tượng vì hệ thống chỉ cho phép một số lượng hạn chế các semaphores được đặt tên và các phân đoạn bộ nhớ dùng chung chiếm một số không gian trong bộ nhớ chính. )
Để chọn một phương pháp bắt đầu, bạn sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
22 trong mệnh đề
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
6 của mô-đun chính. Ví dụ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
22 không nên được sử dụng nhiều hơn một lần trong chương trình
Ngoài ra, bạn có thể sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
25 để lấy đối tượng bối cảnh. Các đối tượng ngữ cảnh có API giống như mô-đun đa xử lý và cho phép một người sử dụng nhiều phương thức bắt đầu trong cùng một chương trình
Lưu ý rằng các đối tượng liên quan đến một bối cảnh có thể không tương thích với các quy trình cho một bối cảnh khác. Cụ thể, các khóa được tạo bằng bối cảnh ngã ba không thể được chuyển đến các quy trình được bắt đầu bằng phương pháp bắt đầu sinh sản hoặc máy chủ ngã ba
Một thư viện muốn sử dụng một phương thức bắt đầu cụ thể có lẽ nên sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
25 để tránh ảnh hưởng đến sự lựa chọn của người dùng thư viện
Cảnh báo
Các phương thức bắt đầu
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
27 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
28 hiện không thể được sử dụng với các tệp thực thi "đóng băng" (i. e. , các tệp nhị phân được tạo bởi các gói như PyInstaller và cx_Freeze) trên Unix. Phương thức bắt đầu của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
6 hỗ trợ hai loại kênh liên lạc giữa các quy trình
hàng đợi
Lớp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41 gần như là bản sao của lớp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
42. Ví dụ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
Hàng đợi là luồng và xử lý an toàn
ống
Hàm
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
43 trả về một cặp đối tượng kết nối được kết nối bởi một đường ống mà theo mặc định là song công (hai chiều). Ví dụ
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
Hai đối tượng kết nối được trả về bởi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
43 đại diện cho hai đầu của đường ống. Mỗi đối tượng kết nối có các phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
45 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
46 (trong số các phương thức khác). Lưu ý rằng dữ liệu trong một đường ống có thể bị hỏng nếu hai quy trình (hoặc luồng) cố gắng đọc hoặc ghi vào cùng một đầu của đường ống cùng một lúc. Tất nhiên, không có nguy cơ tham nhũng từ các quy trình sử dụng các đầu khác nhau của đường ống cùng một lúc
6 chứa các giá trị tương đương của tất cả các nguyên mẫu đồng bộ hóa từ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
0. Chẳng hạn, người ta có thể sử dụng khóa để đảm bảo rằng mỗi lần chỉ có một quy trình in ra đầu ra tiêu chuẩn
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
2
Không sử dụng đầu ra khóa từ các quy trình khác nhau có thể bị lẫn lộn
Chia sẻ trạng thái giữa các tiến trình¶
Như đã đề cập ở trên, khi thực hiện lập trình đồng thời, tốt nhất là tránh sử dụng trạng thái chia sẻ càng nhiều càng tốt. Điều này đặc biệt đúng khi sử dụng nhiều quy trình
Tuy nhiên, nếu bạn thực sự cần sử dụng một số dữ liệu được chia sẻ thì
Dữ liệu có thể được lưu trữ trong bản đồ bộ nhớ dùng chung bằng cách sử dụng
[1,4,9]
00 hoặc
[1,4,9]
01. Ví dụ, đoạn mã sau
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
4
sẽ in
[1,4,9]
0
Các đối số
[1,4,9]
02 và
[1,4,9]
03 được sử dụng khi tạo
[1,4,9]
04 và
[1,4,9]
05 là các loại mã được sử dụng bởi mô-đun
[1,4,9]
06.
[1,4,9]
02 biểu thị số float có độ chính xác kép và
[1,4,9]
03 biểu thị số nguyên đã ký. Các đối tượng được chia sẻ này sẽ được xử lý và an toàn cho luồng
Để linh hoạt hơn trong việc sử dụng bộ nhớ dùng chung, người ta có thể sử dụng mô-đun
[1,4,9]
09 hỗ trợ tạo các đối tượng ctypes tùy ý được cấp phát từ bộ nhớ dùng chung
quy trình máy chủ
Một đối tượng người quản lý được trả về bởi
[1,4,9]
10 kiểm soát một quy trình máy chủ chứa các đối tượng Python và cho phép các quy trình khác thao tác chúng bằng proxy
Người quản lý do
[1,4,9]
10 trả lại sẽ hỗ trợ các loại
[1,4,9]
12,
[1,4,9]
13,
[1,4,9]
14,
[1,4,9]
15,
[1,4,9]
16,
[1,4,9]
17,
[1,4,9]
18,
[1,4,9]
19,
[1,4,9]
20,
[1,4,9]
21,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41,
[1,4,9]
00 và
[1,4,9]
01. Ví dụ,
[1,4,9]
1
sẽ in
[1,4,9]
2
Trình quản lý quy trình máy chủ linh hoạt hơn so với việc sử dụng các đối tượng bộ nhớ dùng chung vì chúng có thể được tạo để hỗ trợ các loại đối tượng tùy ý. Ngoài ra, một trình quản lý duy nhất có thể được chia sẻ bởi các quy trình trên các máy tính khác nhau qua mạng. Tuy nhiên, chúng chậm hơn so với sử dụng bộ nhớ dùng chung
Sử dụng một nhóm công nhân¶
Lớp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5 đại diện cho một nhóm các worker process. Nó có các phương thức cho phép các tác vụ được giảm tải cho các quy trình công nhân theo một số cách khác nhau
Ví dụ
[1,4,9]
3
Lưu ý rằng các phương thức của một nhóm chỉ nên được sử dụng bởi quy trình đã tạo ra nó
Ghi chú
Chức năng trong gói này yêu cầu trẻ em có thể nhập mô-đun
[1,4,9]
26. Điều này được đề cập trong Hướng dẫn lập trình tuy nhiên nó đáng để chỉ ra ở đây. Điều này có nghĩa là một số ví dụ, chẳng hạn như ví dụ
[1,4,9]
27 sẽ không hoạt động trong trình thông dịch tương tác. Ví dụ.
[1,4,9]
4
(Nếu bạn thử điều này, nó sẽ thực sự tạo ra ba lần theo dõi đầy đủ được xen kẽ theo kiểu bán ngẫu nhiên, và sau đó bạn có thể phải dừng quá trình gốc bằng cách nào đó. )
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
0
from multiprocessing import Process, Pipe
def f(conn):
conn.send([42, None, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print(parent_conn.recv()) # prints "[42, None, 'hello']"
p.join()
0 và các trường hợp ngoại lệ¶
Các đối tượng quy trình đại diện cho hoạt động được chạy trong một quy trình riêng biệt. Lớp
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 tương đương với tất cả các phương thức của
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
5
Hàm tạo phải luôn được gọi với các đối số từ khóa. nhóm phải luôn là
[1,4,9]
33; . target là đối tượng có thể gọi được gọi bằng phương thức
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
8. Nó mặc định là
[1,4,9]
33, nghĩa là không có gì được gọi. name là tên quy trình (xem
[1,4,9]
37 để biết thêm chi tiết). args là bộ đối số cho lệnh gọi đích. kwargs là một từ điển các đối số từ khóa cho lệnh gọi đích. Nếu được cung cấp, đối số trình nền chỉ có từ khóa sẽ đặt cờ quy trình
[1,4,9]
38 thành
[1,4,9]
39 hoặc
[1,4,9]
40. Nếu
[1,4,9]
33 (mặc định), cờ này sẽ được kế thừa từ quá trình tạo
Theo mặc định, không có đối số nào được chuyển đến đích. Đối số args, mặc định là
[1,4,9]
42, có thể được sử dụng để chỉ định một danh sách hoặc bộ đối số để chuyển đến đích
Nếu một lớp con ghi đè hàm tạo, nó phải đảm bảo rằng nó gọi hàm tạo của lớp cơ sở (
[1,4,9]
43) trước khi thực hiện bất kỳ điều gì khác đối với quy trình
Đã thay đổi trong phiên bản 3. 3. Đã thêm đối số daemon.
chạy() ¶
Phương thức biểu diễn hoạt động của tiến trình
Bạn có thể ghi đè phương thức này trong một lớp con. Phương thức
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
8 tiêu chuẩn gọi đối tượng có thể gọi được chuyển đến hàm tạo của đối tượng làm đối số đích, nếu có, với các đối số tuần tự và từ khóa được lấy từ các đối số args và kwargs tương ứng
Sử dụng một danh sách hoặc bộ dữ liệu làm đối số args được truyền cho
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 cũng đạt được hiệu quả tương tự
Thí dụ
[1,4,9]
5bắt đầu() ¶
Bắt đầu hoạt động của quy trình
Điều này phải được gọi nhiều nhất một lần cho mỗi đối tượng quy trình. Nó sắp xếp để gọi phương thức
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
8 của đối tượng trong một quy trình riêng biệttham gia([hết thời gian])¶
Nếu thời gian chờ của đối số tùy chọn là
[1,4,9]
33 (mặc định), phương thức sẽ chặn cho đến khi quá trình có phương thức
[1,4,9]
48 được gọi kết thúc. Nếu thời gian chờ là một số dương, nó sẽ chặn tối đa các giây hết thời gian chờ. Lưu ý rằng phương thức trả về
[1,4,9]
33 nếu quá trình của nó kết thúc hoặc nếu phương thức hết thời gian. Kiểm tra
[1,4,9]
50 của quy trình để xác định xem nó có bị chấm dứt hay không
Một quá trình có thể được tham gia nhiều lần
Một quá trình không thể tự tham gia vì điều này sẽ gây ra bế tắc. Có lỗi khi cố gắng tham gia một quy trình trước khi nó được bắt đầu
tên ¶
Tên quy trình. Tên là một chuỗi chỉ được sử dụng cho mục đích nhận dạng. Nó không có ngữ nghĩa. Nhiều tiến trình có thể được đặt tên giống nhau
Tên ban đầu được đặt bởi hàm tạo. Nếu không có tên rõ ràng nào được cung cấp cho hàm tạo, tên có dạng 'Process-N1. N2. …. Nk' được xây dựng, trong đó mỗi Nk là con thứ N của cha mẹ của nó
is_alive() ¶
Trả về xem quá trình có còn hoạt động không
Đại khái, một đối tượng tiến trình vẫn còn hoạt động kể từ thời điểm phương thức
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
3 trả về cho đến khi tiến trình con kết thúcdaemon ¶
Cờ daemon của tiến trình, một giá trị Boolean. Điều này phải được đặt trước khi
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
3 được gọi
Giá trị ban đầu được kế thừa từ quá trình tạo
Khi một tiến trình thoát, nó sẽ cố gắng chấm dứt tất cả các tiến trình con daemon của nó
Lưu ý rằng quy trình daemon không được phép tạo quy trình con. Mặt khác, một quy trình daemon sẽ khiến các con của nó mồ côi nếu nó bị chấm dứt khi quá trình cha mẹ của nó thoát ra. Ngoài ra, đây không phải là dịch vụ hoặc daemon Unix, chúng là các quy trình bình thường sẽ bị chấm dứt (và không được tham gia) nếu các quy trình không phải daemon đã thoát
Ngoài API
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
5, các đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 cũng hỗ trợ các thuộc tính và phương thức saupid ¶
Trả lại ID tiến trình. Trước khi quá trình được sinh ra, đây sẽ là
[1,4,9]
33mã thoát ¶
Mã thoát của trẻ. Đây sẽ là
[1,4,9]
33 nếu quá trình chưa kết thúc
Nếu phương thức
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
8 của đứa trẻ trả về bình thường, mã thoát sẽ là 0. Nếu nó kết thúc qua
[1,4,9]
58 với đối số số nguyên N, thì mã thoát sẽ là N
Nếu đứa trẻ bị chấm dứt do một ngoại lệ không bị bắt trong
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
8, mã thoát sẽ là 1. Nếu nó bị kết thúc bởi tín hiệu N, mã thoát sẽ là giá trị âm -Nkhóa xác thực ¶
6, quy trình chính được gán một chuỗi ngẫu nhiên bằng cách sử dụng
[1,4,9]
61
Khi một đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 được tạo, nó sẽ kế thừa khóa xác thực của quy trình mẹ của nó, mặc dù điều này có thể được thay đổi bằng cách đặt
[1,4,9]
63 thành một chuỗi byte khác
Xem Khóa xác thực .
trọng điểm ¶
Một điều khiển số của một đối tượng hệ thống sẽ trở thành "sẵn sàng" khi quá trình kết thúc
Bạn có thể sử dụng giá trị này nếu muốn đợi nhiều sự kiện cùng lúc bằng cách sử dụng
[1,4,9]
64. Mặt khác, gọi
[1,4,9]
48 đơn giản hơn
Trên Windows, đây là một trình điều khiển hệ điều hành có thể sử dụng được với nhóm lệnh gọi API
[1,4,9]
66 và
[1,4,9]
67. Trên Unix, đây là một bộ mô tả tệp có thể sử dụng được với các nguyên mẫu từ mô-đun
[1,4,9]
68
Mới trong phiên bản 3. 3
chấm dứt() ¶
Chấm dứt quá trình. Trên Unix, điều này được thực hiện bằng tín hiệu
[1,4,9]
69; . Lưu ý rằng các trình xử lý thoát và các mệnh đề cuối cùng, v.v. , sẽ không được thực hiện
Lưu ý rằng các tiến trình con của tiến trình sẽ không bị chấm dứt – chúng sẽ đơn giản trở nên mồ côi
Cảnh báo
Nếu phương pháp này được sử dụng khi quy trình được liên kết đang sử dụng đường ống hoặc hàng đợi thì đường ống hoặc hàng đợi đó có thể bị hỏng và có thể trở nên không sử dụng được bởi quy trình khác. Tương tự, nếu quá trình đã có khóa hoặc semaphore, v.v. sau đó chấm dứt nó có khả năng gây ra bế tắc cho các quá trình khác
giết() ¶
Tương tự như
[1,4,9]
71 nhưng sử dụng tín hiệu
[1,4,9]
72 trên Unix
Mới trong phiên bản 3. 7
đóng() ¶
Đóng đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0, giải phóng tất cả các tài nguyên được liên kết với nó.
[1,4,9]
74 được nâng lên nếu quy trình cơ bản vẫn đang chạy. Khi
[1,4,9]
75 trả về thành công, hầu hết các phương thức và thuộc tính khác của đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 sẽ tăng
[1,4,9]
74
Mới trong phiên bản 3. 7
Lưu ý rằng các phương thức ________ 93, ________ 548, ________ 580, ________ 571 và
[1,4,9]
50 chỉ nên được gọi bởi quy trình đã tạo đối tượng quy trình
Ví dụ sử dụng một số phương pháp của
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
85 khi đối tượng bộ đệm được cung cấp quá nhỏ để đọc thông báo
Nếu
[1,4,9]
86 là một phiên bản của
[1,4,9]
87 thì
[1,4,9]
88 sẽ đưa ra thông báo dưới dạng chuỗi bytengoại lệđa xử lý. Lỗi xác thực ¶
Xảy ra khi có lỗi xác thực
ngoại lệđa xử lý. Lỗi hết giờ ¶
Tăng theo các phương thức có thời gian chờ khi hết thời gian chờ
Đường ống và hàng đợi¶
Khi sử dụng nhiều quy trình, người ta thường sử dụng tính năng truyền thông báo để liên lạc giữa các quy trình và tránh phải sử dụng bất kỳ nguyên tắc đồng bộ hóa nào như khóa
Để truyền tin nhắn, người ta có thể sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
43 (để kết nối giữa hai quy trình) hoặc hàng đợi (cho phép nhiều nhà sản xuất và người tiêu dùng)
Các loại
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41,
[1,4,9]
91 và
[1,4,9]
92 là hàng đợi FIFO nhiều nhà sản xuất, nhiều người tiêu dùng được mô hình hóa trên lớp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
42 trong thư viện tiêu chuẩn. Chúng khác nhau ở chỗ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41 thiếu các phương thức
[1,4,9]
95 và
[1,4,9]
48 được đưa vào Python 2. lớp 5 của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
42
Nếu bạn sử dụng
[1,4,9]
92 thì bạn phải gọi
[1,4,9]
99 cho từng tác vụ bị xóa khỏi hàng đợi, nếu không, semaphore được sử dụng để đếm số lượng tác vụ chưa hoàn thành cuối cùng có thể bị tràn, gây ra ngoại lệ
Lưu ý rằng một người cũng có thể tạo hàng đợi dùng chung bằng cách sử dụng đối tượng người quản lý – xem Người quản lý .
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
501 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
502 thông thường để báo hiệu thời gian chờ. Chúng không có sẵn trong không gian tên
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
504
Ghi chú
Khi một đối tượng được đưa vào hàng đợi, đối tượng đó sẽ được chọn và một chuỗi nền sau đó sẽ xóa dữ liệu đã chọn vào một đường dẫn bên dưới. Điều này có một số hậu quả hơi ngạc nhiên, nhưng sẽ không gây ra bất kỳ khó khăn thực tế nào – nếu chúng thực sự làm phiền bạn thì thay vào đó, bạn có thể sử dụng hàng đợi được tạo bằng trình quản lý.
Sau khi đặt một đối tượng vào một hàng đợi trống, có thể có độ trễ vô cùng nhỏ trước khi phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
505 của hàng đợi trả về
[1,4,9]
40 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
507 có thể trả về mà không cần tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
501
Nếu nhiều quá trình đang xếp hàng các đối tượng, thì có thể các đối tượng được nhận ở đầu kia không theo thứ tự. Tuy nhiên, các đối tượng được xử lý bởi cùng một quy trình sẽ luôn theo thứ tự mong đợi đối với nhau
Cảnh báo
Nếu một quá trình bị giết bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
509 hoặc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
510 trong khi nó đang cố gắng sử dụng một
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41, thì dữ liệu trong hàng đợi có khả năng bị hỏng. Điều này có thể khiến bất kỳ quy trình nào khác gặp ngoại lệ khi nó cố sử dụng hàng đợi sau này
Cảnh báo
Như đã đề cập ở trên, nếu một tiến trình con đã đặt các mục vào hàng đợi (và nó chưa sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
512), thì tiến trình đó sẽ không kết thúc cho đến khi tất cả các mục trong bộ đệm đã được chuyển vào đường ống
Điều này có nghĩa là nếu bạn cố gắng tham gia quá trình đó, bạn có thể gặp bế tắc trừ khi bạn chắc chắn rằng tất cả các mục được đưa vào hàng đợi đã được sử dụng hết. Tương tự, nếu tiến trình con không phải là daemon thì tiến trình cha có thể bị treo khi thoát khi nó cố gắng nối tất cả các con không phải daemon của nó
Lưu ý rằng hàng đợi được tạo bằng trình quản lý không gặp sự cố này. Xem Hướng dẫn lập trình .
Để biết ví dụ về việc sử dụng hàng đợi để liên lạc giữa các quá trình, hãy xem Ví dụ .
đa xử lý. Đường ống([song công])¶
Trả về một cặp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
513 trong số các đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
514 đại diện cho các đầu của một đường ống
Nếu song công là
[1,4,9]
39 (mặc định) thì đường ống là hai chiều. Nếu song công là
[1,4,9]
40 thì đường ống là một chiều.
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
517 chỉ có thể được sử dụng để nhận tin nhắn và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
518 chỉ có thể được sử dụng để gửi tin nhắnlớpđa xử lý. Hàng đợi([kích thước tối đa])¶
Trả về một hàng đợi chia sẻ quy trình được thực hiện bằng cách sử dụng một đường ống và một vài ổ khóa/semaphores. Khi một quy trình lần đầu tiên đặt một mục vào hàng đợi, một chuỗi trung chuyển được bắt đầu để chuyển các đối tượng từ bộ đệm vào đường ống
Các ngoại lệ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
501 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
502 thông thường từ mô-đun
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
504 của thư viện tiêu chuẩn được nâng lên để báo hiệu thời gian chờ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41 thực hiện tất cả các phương pháp của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
42 ngoại trừ
[1,4,9]
95 và
[1,4,9]
48qsize() ¶
Trả về kích thước gần đúng của hàng đợi. Do ngữ nghĩa đa luồng/đa xử lý, con số này không đáng tin cậy
Lưu ý rằng điều này có thể tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
526 trên các nền tảng Unix như macOS nơi mà
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
527 không được triển khaitrống() ¶
Trả lại
[1,4,9]
39 nếu hàng đợi trống, ngược lại là
[1,4,9]
40. Do ngữ nghĩa đa luồng/đa xử lý, điều này không đáng tin cậyđầy đủ() ¶
Trả lại
[1,4,9]
39 nếu hàng đợi đã đầy, ngược lại là
[1,4,9]
40. Do ngữ nghĩa đa luồng/đa xử lý, điều này không đáng tin cậyđặt(obj[ , block[, timeout]])¶
Đặt obj vào hàng đợi. Nếu khối đối số tùy chọn là
[1,4,9]
39 (mặc định) và thời gian chờ là
[1,4,9]
33 (mặc định), hãy chặn nếu cần cho đến khi có chỗ trống. Nếu thời gian chờ là một số dương, nó sẽ chặn hầu hết các giây hết thời gian chờ và tăng ngoại lệ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
502 nếu không có chỗ trống trong thời gian đó. Mặt khác (khối là
[1,4,9]
40), hãy đặt một mục vào hàng đợi nếu có sẵn một vị trí trống ngay lập tức, nếu không thì tăng ngoại lệ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
502 (thời gian chờ bị bỏ qua trong trường hợp đó)
Đã thay đổi trong phiên bản 3. 8. Nếu hàng đợi đã đóng,
[1,4,9]
74 được nâng lên thay vì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
538. put_nowait(obj) ¶
Tương đương với
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
539nhận([chặn[, timeout]])¶
Xóa và trả lại một mục khỏi hàng đợi. Nếu khối đối số tùy chọn là
[1,4,9]
39 (mặc định) và thời gian chờ là
[1,4,9]
33 (mặc định), hãy chặn nếu cần cho đến khi có sẵn một mục. Nếu thời gian chờ là một số dương, nó sẽ chặn tối đa các giây hết thời gian chờ và tăng ngoại lệ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
501 nếu không có mục nào có sẵn trong thời gian đó. Mặt khác (khối là
[1,4,9]
40), trả lại một mục nếu một mục có sẵn ngay lập tức, nếu không thì tăng ngoại lệ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
501 (thời gian chờ bị bỏ qua trong trường hợp đó)
Đã thay đổi trong phiên bản 3. 8. Nếu hàng đợi đã đóng,
[1,4,9]
74 được nâng lên thay vì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
546. get_nowait() ¶
Tương đương với
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
547
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
548 có một số phương thức bổ sung không có trong
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
42. Các phương thức này thường không cần thiết đối với hầu hết mãđóng() ¶
Cho biết rằng quy trình hiện tại sẽ không đưa thêm dữ liệu vào hàng đợi này. Chủ đề nền sẽ thoát sau khi nó đã xóa tất cả dữ liệu được lưu vào bộ đệm vào đường ống. Điều này được gọi tự động khi hàng đợi được thu gom rác
join_thread() ¶
Tham gia chủ đề nền. Điều này chỉ có thể được sử dụng sau khi
[1,4,9]
75 đã được gọi. Nó chặn cho đến khi luồng nền thoát ra, đảm bảo rằng tất cả dữ liệu trong bộ đệm đã được chuyển vào đường ống
Theo mặc định, nếu một quy trình không phải là người tạo hàng đợi thì khi thoát, nó sẽ cố gắng tham gia luồng nền của hàng đợi. Quá trình có thể gọi ________ 1551 để khiến ________ 1552 không làm gì cả
cancel_join_thread() ¶
Ngăn chặn
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
552 chặn. Đặc biệt, điều này ngăn luồng nền tự động được nối khi quá trình thoát – xem
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
552
Tên tốt hơn cho phương pháp này có thể là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
555. Nó có khả năng làm mất dữ liệu trong hàng đợi và bạn gần như chắc chắn sẽ không cần sử dụng nó. Nó thực sự chỉ ở đó nếu bạn cần quy trình hiện tại thoát ngay lập tức mà không cần chờ xóa dữ liệu đã xử lý vào đường ống bên dưới và bạn không quan tâm đến dữ liệu bị mất
Ghi chú
Chức năng của lớp này yêu cầu triển khai semaphore được chia sẻ chức năng trên hệ điều hành máy chủ. Nếu không có một, chức năng trong lớp này sẽ bị vô hiệu hóa và cố gắng khởi tạo một
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41 sẽ dẫn đến một
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
557. Xem bpo-3770 để biết thêm thông tin. Điều này cũng đúng với bất kỳ loại hàng đợi chuyên biệt nào được liệt kê bên dướilớpđa xử lý. Queue đơn giản ¶
Nó là loại
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41 được đơn giản hóa, rất gần với loại
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
559 bị khóađóng() ¶
Đóng hàng đợi. giải phóng nội lực
Một hàng đợi không được sử dụng nữa sau khi nó bị đóng. Ví dụ: các phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
560,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
561 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
505 không còn được gọi nữa
Mới trong phiên bản 3. 9
trống() ¶
Trả lại
[1,4,9]
39 nếu hàng đợi trống, ngược lại là
[1,4,9]
40lấy() ¶
Xóa và trả lại một mục khỏi hàng đợi
đặt(mục) ¶
Đặt mục vào hàng đợi
lớpđa xử lý. JoinableQueue([kích thước tối đa])¶
[1,4,9]
92, một lớp con của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41, là một hàng đợi có thêm các phương thức
[1,4,9]
95 và
[1,4,9]
48task_done() ¶
Chỉ ra rằng một nhiệm vụ được xử lý trước đây đã hoàn thành. Được sử dụng bởi người tiêu dùng xếp hàng. Đối với mỗi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
560 được sử dụng để tìm nạp một tác vụ, một cuộc gọi tiếp theo tới
[1,4,9]
95 sẽ báo cho hàng đợi rằng quá trình xử lý tác vụ đã hoàn tất
Nếu một
[1,4,9]
48 hiện đang bị chặn, nó sẽ tiếp tục khi tất cả các mục đã được xử lý (có nghĩa là đã nhận được cuộc gọi
[1,4,9]
95 cho mọi mục đã được
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
561 vào hàng đợi)
Tăng
[1,4,9]
74 nếu được gọi nhiều lần hơn số vật phẩm được đặt trong hàng đợitham gia() ¶
Chặn cho đến khi tất cả các mục trong hàng đợi đã được nhận và xử lý
Số lượng nhiệm vụ chưa hoàn thành tăng lên bất cứ khi nào một mục được thêm vào hàng đợi. Số lượng giảm xuống bất cứ khi nào người tiêu dùng gọi
[1,4,9]
95 để cho biết rằng mặt hàng đã được lấy và mọi công việc trên mặt hàng đó đã hoàn tất. Khi số nhiệm vụ chưa hoàn thành giảm xuống 0,
[1,4,9]
48 sẽ bỏ chặn
Điều khoản khác¶
đa xử lý. active_children() ¶
Trả về danh sách tất cả các phần tử con còn sống của tiến trình hiện tại
Gọi điều này có tác dụng phụ là “tham gia” bất kỳ quy trình nào đã kết thúc
đa xử lý. số lượng cpu() ¶
Trả về số lượng CPU trong hệ thống
Con số này không tương đương với số lượng CPU mà tiến trình hiện tại có thể sử dụng. Số lượng CPU có thể sử dụng có thể thu được với
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
577
Khi không thể xác định số lượng CPU, một
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
526 được nâng lên
Xem thêm
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
579đa xử lý. current_ process() ¶
Trả về đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 tương ứng với quy trình hiện tại
Tương tự của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
581đa xử lý. parent_process() ¶
Trả về đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 tương ứng với tiến trình cha của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
583. Đối với quy trình chính,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
6 bị đóng băng để tạo tệp thực thi Windows. (Đã được thử nghiệm với py2exe, PyInstaller và cx_Freeze. )
Người ta cần gọi hàm này ngay sau dòng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
6 của mô-đun chính. Ví dụ
[1,4,9]
7
Nếu dòng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
588 bị bỏ qua thì việc cố chạy tệp thực thi bị đóng băng sẽ tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
589
Gọi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
588 không có hiệu lực khi được gọi trên bất kỳ hệ điều hành nào khác ngoài Windows. Ngoài ra, nếu mô-đun đang được trình thông dịch Python trên Windows chạy bình thường (chương trình chưa bị đóng băng) thì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
588 không có hiệu lựcđa xử lý. get_all_start_methods() ¶
Trả về danh sách các phương thức bắt đầu được hỗ trợ, phương thức đầu tiên là mặc định. Các phương pháp bắt đầu có thể là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
29,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
27 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
28. Trên Windows chỉ có sẵn
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
27. Trên Unix,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
29 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
27 luôn được hỗ trợ, với
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
29 là mặc định
Mới trong phiên bản 3. 4
đa xử lý. get_context(phương thức=Không)¶
Trả về một đối tượng ngữ cảnh có cùng thuộc tính với mô-đun
33 thì ngữ cảnh mặc định được trả về. Mặt khác, phương thức phải là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
29,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
27,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
28.
[1,4,9]
74 được nâng lên nếu phương thức bắt đầu được chỉ định không khả dụng
Mới trong phiên bản 3. 4
đa xử lý. get_start_method(allow_none=Sai)¶
Trả về tên của phương thức bắt đầu được sử dụng để bắt đầu các quy trình
Nếu phương thức bắt đầu chưa được sửa và allow_none là sai, thì phương thức bắt đầu được sửa thành mặc định và tên được trả về. Nếu phương thức bắt đầu chưa được sửa và allow_none là đúng thì trả về
[1,4,9]
33
Giá trị trả về có thể là ________ 229, ________ 227, ________ 228 hoặc ________ 533.
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
29 là mặc định trên Unix, trong khi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
27 là mặc định trên Windows và macOS
Đã thay đổi trong phiên bản 3. 8. Trên macOS, phương thức bắt đầu sinh sản hiện là mặc định. Phương pháp bắt đầu ngã ba nên được coi là không an toàn vì nó có thể dẫn đến sự cố của quy trình con. Xem bpo-33725.
Mới trong phiên bản 3. 4
đa xử lý. set_executable(có thể thực thi) ¶
Đặt đường dẫn của trình thông dịch Python để sử dụng khi bắt đầu tiến trình con. (Theo mặc định,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
612 được sử dụng). Embedders có thể sẽ cần phải làm một cái gì đó như
[1,4,9]
8
trước khi họ có thể tạo các tiến trình con
Đã thay đổi trong phiên bản 3. 4. Hiện được hỗ trợ trên Unix khi sử dụng phương thức khởi động
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
27.
Đã thay đổi trong phiên bản 3. 11. Chấp nhận một đối tượng giống đường dẫn .
đa xử lý. set_start_method(phương thức , lực lượng=False)¶
Đặt phương thức sẽ được sử dụng để bắt đầu các tiến trình con. Đối số phương thức có thể là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
29,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
27 hoặc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
28. Tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
589 nếu phương thức bắt đầu đã được đặt và lực không phải là
[1,4,9]
39. Nếu phương thức là
[1,4,9]
33 và lực lượng là
[1,4,9]
39 thì phương thức bắt đầu được đặt thành
[1,4,9]
33. Nếu phương thức là
[1,4,9]
33 và lực lượng là
[1,4,9]
40 thì bối cảnh được đặt thành bối cảnh mặc định
Lưu ý rằng điều này nên được gọi nhiều nhất một lần và nó phải được bảo vệ bên trong mệnh đề
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
626,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
627,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
628,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
629,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
630 hoặc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
631
Đối tượng kết nối¶
Các đối tượng kết nối cho phép gửi và nhận các đối tượng hoặc chuỗi có thể chọn. Chúng có thể được coi là ổ cắm được kết nối theo định hướng thông báo
Đối tượng kết nối thường được tạo bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
559 – xem thêm Người nghe và Máy khách . lớpđa xử lý. sự liên quan. Kết nối ¶ gửi(obj)¶
Gửi một đối tượng đến đầu kia của kết nối sẽ được đọc bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
46
Đối tượng phải được picklable. Dưa chua rất lớn (khoảng 32 MiB+, mặc dù nó phụ thuộc vào HĐH) có thể gây ra ngoại lệ
[1,4,9]
74recv() ¶
Trả lại một đối tượng được gửi từ đầu kia của kết nối bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
45. Chặn cho đến khi có thứ gì đó để nhận. Tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
636 nếu không còn gì để nhận và đầu kia đã đóngfileno() ¶
Trả lại bộ mô tả tệp hoặc tay cầm được sử dụng bởi kết nối
đóng() ¶
Đóng kết nối
Điều này được gọi tự động khi kết nối được thu gom rác
thăm dò ý kiến([hết thời gian])¶
Trả về xem có bất kỳ dữ liệu nào có sẵn để đọc không
Nếu thời gian chờ không được chỉ định thì nó sẽ quay lại ngay lập tức. Nếu thời gian chờ là một số thì số này chỉ định thời gian tối đa tính bằng giây để chặn. Nếu thời gian chờ là
[1,4,9]
33 thì thời gian chờ vô hạn được sử dụng
Lưu ý rằng nhiều đối tượng kết nối có thể được thăm dò cùng một lúc bằng cách sử dụng
[1,4,9]
64send_bytes(bộ đệm[ , offset[, size]])¶
Gửi dữ liệu byte từ một đối tượng giống như byte dưới dạng một tin nhắn hoàn chỉnh.
Nếu offset được đưa ra thì dữ liệu được đọc từ vị trí đó trong bộ đệm. Nếu kích thước được đưa ra thì nhiều byte sẽ được đọc từ bộ đệm. Bộ đệm rất lớn (khoảng 32 MiB+, mặc dù nó phụ thuộc vào hệ điều hành) có thể gây ra ngoại lệ
[1,4,9]
74recv_byte([độ dài tối đa])¶
Trả về một thông báo đầy đủ về dữ liệu byte được gửi từ đầu kia của kết nối dưới dạng chuỗi. Chặn cho đến khi có thứ gì đó để nhận. Tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
636 nếu không còn gì để nhận và đầu kia đã đóng
Nếu độ dài tối đa được chỉ định và thông báo dài hơn độ dài tối đa thì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
546 sẽ được nâng lên và kết nối sẽ không thể đọc được nữa
Đã thay đổi trong phiên bản 3. 3. Hàm này từng tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
642, hiện là bí danh của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
546. recv_bytes_into(bộ đệm[ , offset])¶
Đọc vào bộ đệm một thông báo đầy đủ về dữ liệu byte được gửi từ đầu kia của kết nối và trả về số byte trong thông báo. Chặn cho đến khi có thứ gì đó để nhận. Tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
636 nếu không còn gì để nhận và đầu kia đã đóng
bộ đệm phải là một đối tượng giống như byte có thể ghi . Nếu offset được đưa ra thì thông báo sẽ được ghi vào bộ đệm từ vị trí đó. Độ lệch phải là một số nguyên không âm nhỏ hơn độ dài của bộ đệm (tính bằng byte).
Nếu bộ đệm quá ngắn thì một ngoại lệ
[1,4,9]
87 sẽ được đưa ra và thông báo hoàn chỉnh có sẵn dưới dạng
[1,4,9]
88 trong đó
[1,4,9]
86 là trường hợp ngoại lệ
Đã thay đổi trong phiên bản 3. 3. Bản thân các đối tượng kết nối giờ đây có thể được chuyển giữa các quy trình bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
648 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
649.
Mới trong phiên bản 3. 3. Các đối tượng kết nối hiện hỗ trợ giao thức quản lý bối cảnh – xem Các loại trình quản lý bối cảnh .
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
650 trả về đối tượng kết nối và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
651 gọi
[1,4,9]
75.
Ví dụ
[1,4,9]
9
Cảnh báo
Phương pháp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
649 tự động giải nén dữ liệu mà nó nhận được, đây có thể là rủi ro bảo mật trừ khi bạn có thể tin tưởng vào quy trình đã gửi tin nhắn
Do đó, trừ khi đối tượng kết nối được tạo bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
43, bạn chỉ nên sử dụng các phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
46 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
45 sau khi thực hiện một số loại xác thực. Xem Khóa xác thực .
Cảnh báo
Nếu một quá trình bị giết trong khi nó đang cố đọc hoặc ghi vào một đường dẫn thì dữ liệu trong đường dẫn đó có khả năng bị hỏng, vì có thể không thể chắc chắn ranh giới của thông báo nằm ở đâu
Nguyên tắc đồng bộ hóa¶
Nói chung, các nguyên hàm đồng bộ hóa không cần thiết trong chương trình đa xử lý như trong chương trình đa luồng. Xem tài liệu về mô-đun
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
0
Lưu ý rằng người ta cũng có thể tạo nguyên mẫu đồng bộ hóa bằng cách sử dụng đối tượng người quản lý – xem Người quản lý .
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
658
Mới trong phiên bản 3. 3
lớpđa xử lý. BoundedSemaphore([giá trị])¶
Một đối tượng semaphore giới hạn. một tương tự gần của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
659
Một sự khác biệt duy nhất từ tương tự gần của nó tồn tại. đối số đầu tiên của phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
660 của nó được đặt tên là khối, phù hợp với
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
661
Ghi chú
Trên macOS, điều này không thể phân biệt được với
[1,4,9]
17 vì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
527 không được triển khai trên nền tảng đólớpđa xử lý. Điều kiện([khóa])¶
Biến điều kiện. một bí danh cho
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
664
Nếu lock được chỉ định thì nó phải là một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
668 đã được thêm vào. lớpđa xử lý. Sự kiện ¶
Một bản sao của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
669lớpđa xử lý. Khóa ¶
Một đối tượng khóa không đệ quy. một tương tự gần của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
670. Khi một quy trình hoặc luồng đã nhận được khóa, các nỗ lực tiếp theo để lấy khóa đó từ bất kỳ quy trình hoặc luồng nào sẽ bị chặn cho đến khi khóa được giải phóng; . Các khái niệm và hành vi của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
670 khi nó áp dụng cho luồng được sao chép ở đây trong
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
672 vì nó áp dụng cho cả quy trình hoặc luồng, ngoại trừ như đã lưu ý
Lưu ý rằng
[1,4,9]
15 thực sự là một hàm xuất xưởng trả về một thể hiện của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
674 được khởi tạo với ngữ cảnh mặc định
[1,4,9]
15 hỗ trợ giao thức trình quản lý ngữ cảnh và do đó có thể được sử dụng trong câu lệnh
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
676. mua lại(chặn=Đúng, timeout=None)¶
Nhận khóa, chặn hoặc không chặn
Với đối số khối được đặt thành
[1,4,9]
39 (mặc định), lệnh gọi phương thức sẽ chặn cho đến khi khóa ở trạng thái mở khóa, sau đó đặt thành bị khóa và trả về
[1,4,9]
39. Lưu ý rằng tên của đối số đầu tiên này khác với tên trong
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
679
Với đối số khối được đặt thành
[1,4,9]
40, lệnh gọi phương thức không chặn. Nếu khóa hiện đang ở trạng thái khóa, hãy trả lại
[1,4,9]
40;
Khi được gọi với giá trị dương, dấu chấm động cho thời gian chờ, hãy chặn tối đa số giây được chỉ định theo thời gian chờ miễn là không thể lấy được khóa. Các yêu cầu có giá trị âm cho thời gian chờ tương đương với thời gian chờ bằng 0. Các yêu cầu có giá trị thời gian chờ là
[1,4,9]
33 (mặc định) đặt khoảng thời gian chờ thành vô hạn. Lưu ý rằng cách xử lý giá trị âm hoặc giá trị
[1,4,9]
33 cho thời gian chờ khác với hành vi đã triển khai trong
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
679. Đối số thời gian chờ không có ý nghĩa thực tế nếu đối số khối được đặt thành
[1,4,9]
40 và do đó bị bỏ qua. Trả về
[1,4,9]
39 nếu đã lấy được khóa hoặc
[1,4,9]
40 nếu hết thời gian chờbản phát hành() ¶
Phát hành một khóa. Điều này có thể được gọi từ bất kỳ quy trình hoặc luồng nào, không chỉ quy trình hoặc luồng ban đầu có khóa
Hành vi giống như trong
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
689 ngoại trừ khi được gọi trên khóa không khóa, một
[1,4,9]
74 được nâng lênlớpđa xử lý. RLock ¶
Một đối tượng khóa đệ quy. một tương tự gần của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
691. Khóa đệ quy phải được giải phóng bởi quy trình hoặc luồng đã nhận được nó. Khi một quy trình hoặc luồng đã nhận được khóa đệ quy, cùng một quy trình hoặc luồng đó có thể lấy lại nó mà không bị chặn;
Lưu ý rằng
[1,4,9]
16 thực sự là một hàm xuất xưởng trả về một thể hiện của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
693 được khởi tạo với ngữ cảnh mặc định
[1,4,9]
16 hỗ trợ giao thức trình quản lý ngữ cảnh và do đó có thể được sử dụng trong câu lệnh
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
676. mua lại(chặn=Đúng, timeout=None)¶
Nhận khóa, chặn hoặc không chặn
Khi được gọi với đối số khối được đặt thành
[1,4,9]
39, hãy chặn cho đến khi khóa ở trạng thái không khóa (không thuộc sở hữu của bất kỳ quy trình hoặc luồng nào) trừ khi khóa đã được sở hữu bởi quy trình hoặc luồng hiện tại. Sau đó, quy trình hoặc luồng hiện tại có quyền sở hữu khóa (nếu nó chưa có quyền sở hữu) và mức đệ quy bên trong khóa tăng thêm một, dẫn đến giá trị trả về là
[1,4,9]
39. Lưu ý rằng có một số điểm khác biệt trong hành vi của đối số đầu tiên này so với cách triển khai của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
698, bắt đầu từ tên của chính đối số đó
Khi được gọi với đối số khối được đặt thành
[1,4,9]
40, không chặn. Nếu khóa đã được mua (và do đó được sở hữu) bởi một quy trình hoặc luồng khác, thì quy trình hoặc luồng hiện tại không có quyền sở hữu và mức đệ quy trong khóa không bị thay đổi, dẫn đến giá trị trả về là
[1,4,9]
40. Nếu khóa ở trạng thái không khóa, quy trình hoặc luồng hiện tại sẽ có quyền sở hữu và mức đệ quy được tăng lên, dẫn đến giá trị trả về là
[1,4,9]
39
Việc sử dụng và hành vi của đối số thời gian chờ giống như trong
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
661. Lưu ý rằng một số hành vi hết thời gian này khác với các hành vi đã triển khai trong
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
698bản phát hành() ¶
Phát hành khóa, giảm mức đệ quy. Nếu sau khi giảm, mức đệ quy bằng 0, hãy đặt lại khóa thành mở khóa (không thuộc sở hữu của bất kỳ quy trình hoặc luồng nào) và nếu bất kỳ quy trình hoặc luồng nào khác bị chặn chờ khóa được mở khóa, hãy cho phép chính xác một trong số chúng tiếp tục. Nếu sau khi giảm, mức đệ quy vẫn khác không, thì khóa vẫn bị khóa và thuộc sở hữu của quy trình gọi hoặc luồng
Chỉ gọi phương thức này khi quá trình gọi hoặc luồng sở hữu khóa. Một
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
538 được nâng lên nếu phương thức này được gọi bởi một quy trình hoặc luồng không phải là chủ sở hữu hoặc nếu khóa ở trạng thái mở khóa (không có chủ sở hữu). Lưu ý rằng loại ngoại lệ được đưa ra trong tình huống này khác với hành vi được triển khai trong
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
505lớpđa xử lý. Semaphore([giá trị])¶
Một đối tượng semaphore. một tương tự gần của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
506
Một sự khác biệt duy nhất từ tương tự gần của nó tồn tại. đối số đầu tiên của phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
660 của nó được đặt tên là khối, phù hợp với
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
661
Ghi chú
Trên macOS,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
509 không được hỗ trợ, vì vậy, việc gọi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
510 khi hết thời gian chờ sẽ mô phỏng hành vi của chức năng đó bằng cách sử dụng vòng lặp ngủ
Ghi chú
Nếu tín hiệu SIGINT được tạo bởi Ctrl-C đến trong khi luồng chính bị chặn bởi lệnh gọi tới
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
511,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
661,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
513,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
514,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
515 hoặc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
516 thì cuộc gọi sẽ bị gián đoạn ngay lập tức và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
517 sẽ được nâng lên
Điều này khác với hành vi của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
0 trong đó SIGINT sẽ bị bỏ qua trong khi các cuộc gọi chặn tương đương đang diễn ra
Ghi chú
Một số chức năng của gói này yêu cầu triển khai semaphore được chia sẻ chức năng trên hệ điều hành máy chủ. Nếu không có, mô-đun
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
519 sẽ bị vô hiệu hóa và cố gắng nhập nó sẽ dẫn đến lỗi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
557. Xem bpo-3770 để biết thêm thông tin
Đối tượng from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print(q.get()) # prints "[42, None, 'hello']"
p.join()
521 được chia sẻ¶
Có thể tạo các đối tượng dùng chung bằng bộ nhớ dùng chung có thể được kế thừa bởi các tiến trình con
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
521 được phân bổ từ bộ nhớ dùng chung. Theo mặc định, giá trị trả về thực sự là một trình bao bọc được đồng bộ hóa cho đối tượng. Bản thân đối tượng có thể được truy cập thông qua thuộc tính giá trị của
[1,4,9]
00
typecode_or_type xác định loại đối tượng được trả về. nó là loại ctypes hoặc mã loại một ký tự thuộc loại được sử dụng bởi mô-đun
[1,4,9]
06. *args được chuyển đến hàm tạo cho loại
Nếu khóa là
[1,4,9]
39 (mặc định) thì một đối tượng khóa đệ quy mới được tạo để đồng bộ hóa quyền truy cập vào giá trị. Nếu khóa là đối tượng
[1,4,9]
15 hoặc
[1,4,9]
16 thì đối tượng đó sẽ được sử dụng để đồng bộ hóa quyền truy cập vào giá trị. Nếu khóa là
[1,4,9]
40 thì quyền truy cập vào đối tượng được trả về sẽ không được khóa tự động bảo vệ, vì vậy nó không nhất thiết phải là “quy trình an toàn”
Các hoạt động như
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
529 liên quan đến đọc và viết không phải là nguyên tử. Vì vậy, nếu, ví dụ, bạn muốn tăng nguyên tử một giá trị được chia sẻ thì không đủ để làm
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
50
Giả sử khóa được liên kết là đệ quy (theo mặc định), thay vào đó, bạn có thể làm
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
Trả về một mảng ctypes được phân bổ từ bộ nhớ dùng chung. Theo mặc định, giá trị trả về thực sự là một trình bao bọc được đồng bộ hóa cho mảng
typecode_or_type xác định loại phần tử của mảng được trả về. nó là loại ctypes hoặc mã loại một ký tự thuộc loại được sử dụng bởi mô-đun
[1,4,9]
06. Nếu size_or_initializer là một số nguyên, thì nó xác định độ dài của mảng và ban đầu mảng sẽ bằng 0. Mặt khác, size_or_initializer là một chuỗi được sử dụng để khởi tạo mảng và độ dài của nó xác định độ dài của mảng
Nếu khóa là
[1,4,9]
39 (mặc định) thì một đối tượng khóa mới được tạo để đồng bộ hóa quyền truy cập vào giá trị. Nếu khóa là đối tượng
[1,4,9]
15 hoặc
[1,4,9]
16 thì đối tượng đó sẽ được sử dụng để đồng bộ hóa quyền truy cập vào giá trị. Nếu khóa là
[1,4,9]
40 thì quyền truy cập vào đối tượng được trả về sẽ không được khóa tự động bảo vệ, vì vậy nó không nhất thiết phải là “quy trình an toàn”
Lưu ý rằng khóa chỉ là một đối số từ khóa
Lưu ý rằng một mảng của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
535 có các thuộc tính giá trị và thô cho phép một người sử dụng nó để lưu trữ và truy xuất các chuỗi
Mô-đun
[1,4,9]
09¶
Mô-đun
[1,4,9]
09 cung cấp các hàm để cấp phát các đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
521 từ bộ nhớ dùng chung có thể được kế thừa bởi các tiến trình con
Ghi chú
Mặc dù có thể lưu trữ một con trỏ trong bộ nhớ dùng chung, hãy nhớ rằng con trỏ này sẽ đề cập đến một vị trí trong không gian địa chỉ của một quy trình cụ thể. Tuy nhiên, con trỏ rất có thể không hợp lệ trong ngữ cảnh của quy trình thứ hai và việc cố gắng hủy đăng ký con trỏ khỏi quy trình thứ hai có thể gây ra sự cố
Trả về một mảng ctypes được phân bổ từ bộ nhớ dùng chung
typecode_or_type xác định loại phần tử của mảng được trả về. nó là loại ctypes hoặc mã loại một ký tự thuộc loại được sử dụng bởi mô-đun
[1,4,9]
06. Nếu size_or_initializer là một số nguyên thì nó xác định độ dài của mảng và ban đầu mảng sẽ bằng 0. Mặt khác, size_or_initializer là một chuỗi được sử dụng để khởi tạo mảng và độ dài của nó xác định độ dài của mảng
Lưu ý rằng cài đặt và nhận một phần tử có khả năng không phải là nguyên tử – thay vào đó hãy sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
540 để đảm bảo rằng quyền truy cập được tự động đồng bộ hóa bằng cách sử dụng khóađa xử lý. sharedctypes. Giá trị thô(typecode_or_type , *args)¶
Trả về một đối tượng ctypes được phân bổ từ bộ nhớ dùng chung
typecode_or_type xác định loại đối tượng được trả về. nó là loại ctypes hoặc mã loại một ký tự thuộc loại được sử dụng bởi mô-đun
[1,4,9]
06. *args được chuyển đến hàm tạo cho loại
Lưu ý rằng cài đặt và nhận giá trị có khả năng không phải là nguyên tử – thay vào đó hãy sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
542 để đảm bảo rằng quyền truy cập được tự động đồng bộ hóa bằng cách sử dụng khóa
Lưu ý rằng một mảng của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
535 có các thuộc tính
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
544 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
545 cho phép một người sử dụng nó để lưu trữ và truy xuất các chuỗi – xem tài liệu về
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
547 ngoại trừ tùy thuộc vào giá trị của khóa, trình bao bọc đồng bộ hóa an toàn cho quy trình có thể được trả về thay vì một mảng ctypes thô
Nếu khóa là
[1,4,9]
39 (mặc định) thì một đối tượng khóa mới được tạo để đồng bộ hóa quyền truy cập vào giá trị. Nếu khóa là đối tượng
[1,4,9]
15 hoặc
[1,4,9]
16 thì đối tượng đó sẽ được sử dụng để đồng bộ hóa quyền truy cập vào giá trị. Nếu khóa là
[1,4,9]
40 thì quyền truy cập vào đối tượng được trả về sẽ không được khóa tự động bảo vệ, vì vậy nó không nhất thiết phải là “quy trình an toàn”
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
552 ngoại trừ tùy thuộc vào giá trị của khóa, trình bao bọc đồng bộ hóa an toàn cho quy trình có thể được trả về thay vì đối tượng ctypes thô
Nếu khóa là
[1,4,9]
39 (mặc định) thì một đối tượng khóa mới được tạo để đồng bộ hóa quyền truy cập vào giá trị. Nếu khóa là đối tượng
[1,4,9]
15 hoặc
[1,4,9]
16 thì đối tượng đó sẽ được sử dụng để đồng bộ hóa quyền truy cập vào giá trị. Nếu khóa là
[1,4,9]
40 thì quyền truy cập vào đối tượng được trả về sẽ không được khóa tự động bảo vệ, vì vậy nó không nhất thiết phải là “quy trình an toàn”
Lưu ý rằng khóa là đối số chỉ có từ khóa
đa xử lý. sharedctypes. bản sao(obj) ¶
Trả về đối tượng ctypes được cấp phát từ bộ nhớ dùng chung, đây là bản sao của đối tượng ctypes obj
đa xử lý. sharedctypes. đồng bộ(obj[ , lock])¶
Trả về một đối tượng trình bao an toàn cho một đối tượng ctypes sử dụng khóa để đồng bộ hóa quyền truy cập. Nếu khóa là
[1,4,9]
33 (mặc định) thì đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
558 được tạo tự động
Một trình bao bọc được đồng bộ hóa sẽ có hai phương thức ngoài các phương thức của đối tượng mà nó bao bọc.
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
559 trả về đối tượng được bọc và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
560 trả về đối tượng khóa được sử dụng để đồng bộ hóa
Lưu ý rằng việc truy cập đối tượng ctypes thông qua trình bao bọc có thể chậm hơn rất nhiều so với truy cập đối tượng ctypes thô
Đã thay đổi trong phiên bản 3. 5. Các đối tượng được đồng bộ hóa hỗ trợ giao thức trình quản lý ngữ cảnh .
Bảng bên dưới so sánh cú pháp tạo các đối tượng ctypes dùng chung từ bộ nhớ dùng chung với cú pháp ctypes thông thường. (Trong bảng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
561 là một phân lớp nào đó của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
562. )
ctypes
sharedctypes sử dụng loại
sharedctypes sử dụng mã kiểu
c_double(2. 4)
RawValue(c_double, 2. 4)
RawValue('d', 2. 4)
Cấu trúc của tôi(4, 6)
RawValue(MyStruct, 4, 6)
(c_short * 7)()
RawArray(c_short, 7)
RawArray('h', 7)
(c_int * 3)(9, 2, 8)
RawArray(c_int, (9, 2, 8))
RawArray('i', (9, 2, 8))
Dưới đây là một ví dụ trong đó một số đối tượng ctypes được sửa đổi bởi một tiến trình con
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
52
Kết quả in ra là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
53
Người quản lý¶
Trình quản lý cung cấp cách tạo dữ liệu có thể được chia sẻ giữa các quy trình khác nhau, bao gồm chia sẻ qua mạng giữa các quy trình chạy trên các máy khác nhau. Một đối tượng người quản lý điều khiển một quy trình máy chủ quản lý các đối tượng được chia sẻ. Các quy trình khác có thể truy cập các đối tượng được chia sẻ bằng cách sử dụng proxy
đa xử lý. Người quản lý() ¶
Trả về một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
563 đã 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 tiến 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
Các quy trình quản lý sẽ bị tắt ngay khi chúng được thu gom rác hoặc quy trình mẹ của chúng thoát ra. Các lớp người quản lý được định nghĩa trong mô-đun
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
564lớpđa xử lý. quản lý. Trình quản lý cơ sở(địa chỉ=Không có . 0, authkey=None, serializer='pickle', ctx=None, *, shutdown_timeout=1.0) ¶
Tạo đối tượng BaseManager
Sau khi tạo, người ta nên gọi
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
3 hoặc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
566 để đảm bảo rằng đối tượng người quản lý đề cập đến quy trình người quản lý đã bắt đầu
address là địa chỉ mà quá trình quản lý lắng nghe các kết nối mới. Nếu địa chỉ là
[1,4,9]
33 thì một địa chỉ tùy ý được chọn
authkey là khóa xác thực sẽ được sử dụng để kiểm tra tính hợp lệ của các kết nối đến quy trình máy chủ. Nếu authkey là
[1,4,9]
33 thì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
569 được sử dụng. Nếu không thì authkey được sử dụng và nó phải là một chuỗi byte
bộ nối tiếp phải là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
570 (sử dụng tuần tự hóa
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
571) hoặc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
572 (sử dụng tuần tự hóa
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
573)
ctx là một đối tượng ngữ cảnh hoặc
[1,4,9]
33 (sử dụng ngữ cảnh hiện tại). Xem hàm
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
25
shutdown_timeout là thời gian chờ tính bằng giây được sử dụng để đợi cho đến khi quá trình được người quản lý sử dụng hoàn thành trong phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
576. Nếu hết thời gian tắt máy, quá trình kết thúc. Nếu kết thúc quá trình cũng hết thời gian, quá trình bị hủy
Đã thay đổi trong phiên bản 3. 11. Đã thêm thông số shutdown_timeout.
start([trình khởi tạo[, initargs]])¶
Bắt đầu một quy trình con để khởi động trình quản lý. Nếu trình khởi tạo không phải là
[1,4,9]
33 thì quy trình con sẽ gọi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
578 khi nó bắt đầuget_server() ¶
Trả về một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
579 đại diện cho máy chủ thực dưới sự kiểm soát của Trình quản lý. Đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
579 hỗ trợ phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
581
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
54
Ngoài ra,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
579 còn có thuộc tính
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
583kết nối() ¶
Kết nối đối tượng quản lý cục bộ với quy trình quản lý từ xa
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
55tắt máy() ¶
Dừng quá trình được sử dụng bởi người quản lý. Điều này chỉ khả dụng nếu
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
Một phương thức lớp có thể được sử dụng để đăng ký một loại hoặc có thể gọi được với lớp người quản lý
typeid là một "định danh loại" được sử dụng để xác định một loại đối tượng được chia sẻ cụ thể. Đây phải là một chuỗi
có thể gọi được là một có thể gọi được sử dụng để tạo các đối tượng cho loại định danh này. Nếu một phiên bản trình quản lý sẽ được kết nối với máy chủ bằng cách sử dụng phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
585 hoặc nếu đối số phương thức tạo là
[1,4,9]
40 thì điều này có thể được để lại là
[1,4,9]
33
proxytype là một lớp con của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
588 được sử dụng để tạo proxy cho các đối tượng dùng chung với typeid này. Nếu
[1,4,9]
33 thì một lớp proxy được tạo tự động
được sử dụng để chỉ định một chuỗi tên phương thức mà proxy cho typeid này sẽ được phép truy cập bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
590. (Nếu tiếp xúc là
[1,4,9]
33 thì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
592 được sử dụng thay thế nếu nó tồn tại. ) Trong trường hợp không có danh sách hiển thị nào được chỉ định, tất cả các “phương thức công khai” của đối tượng được chia sẻ sẽ có thể truy cập được. (Ở đây “phương thức công khai” có nghĩa là bất kỳ thuộc tính nào có phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
593 và tên của nó không bắt đầu bằng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
594. )
method_to_typeid là ánh xạ được sử dụng để chỉ định kiểu trả về của các phương thức được hiển thị đó sẽ trả về proxy. Nó ánh xạ các tên phương thức thành các chuỗi typeid. (Nếu method_to_typeid là
[1,4,9]
33 thì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
596 được sử dụng thay thế nếu nó tồn tại. ) Nếu tên của phương thức không phải là khóa của ánh xạ này hoặc nếu ánh xạ là
[1,4,9]
33 thì đối tượng được phương thức trả về sẽ được sao chép theo giá trị
create_method xác định xem một phương thức có nên được tạo với tên typeid có thể được sử dụng để báo cho quy trình máy chủ tạo một đối tượng dùng chung mới và trả về proxy cho nó hay không. Theo mặc định, nó là
[1,4,9]
39
Phiên bản
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
599 cũng có một thuộc tính chỉ đọcđịa chỉ ¶
Địa chỉ được sử dụng bởi người quản lý
Đã thay đổi trong phiên bản 3. 3. Các đối tượng trình quản lý hỗ trợ giao thức quản lý ngữ cảnh – xem Các loại trình quản lý ngữ cảnh .
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
650 bắt đầu quá trình máy chủ (nếu nó chưa bắt đầu) và sau đó trả về đối tượng người quản lý.
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
651 cuộc gọi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
576.
Trong các phiên bản trước,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
650 không bắt đầu quy trình máy chủ của người quản lý nếu nó chưa được bắt đầulớpđa xử lý. quản lý. Trình quản lý đồng bộ hóa ¶
Một lớp con của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
599 có thể được sử dụng để đồng bộ hóa các quy trình. Các đối tượng thuộc loại này được trả về bởi
Các phương thức của nó tạo và trả về Đối tượng proxy cho một số loại dữ liệu thường được sử dụng để đồng bộ hóa giữa các quy trình. Điều này đáng chú ý bao gồm các danh sách và từ điển được chia sẻ.
Rào cản(các bên[ , action[, timeout]])¶
Tạo một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
658 được chia sẻ và trả về một proxy cho nó
Mới trong phiên bản 3. 3
BoundedSemaphore([giá trị])¶
Tạo một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
659 được chia sẻ và trả về một proxy cho nóĐiều kiện([khóa])¶
Tạo một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
664 được chia sẻ và trả về một proxy cho nó
Nếu lock được cung cấp thì nó phải là proxy cho đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
670 hoặc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
691
Đã thay đổi trong phiên bản 3. 3. Phương pháp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
668 đã được thêm vào. Sự kiện() ¶
Tạo một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
669 được chia sẻ và trả về một proxy cho nóKhóa() ¶
Tạo một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
670 được chia sẻ và trả về một proxy cho nóKhông gian tên() ¶
Tạo đối tượng
[1,4,9]
14 được chia sẻ và trả lại proxy cho đối tượng đóHàng đợi([kích thước tối đa])¶
Tạo một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
42 được chia sẻ và trả về một proxy cho nóRLock() ¶
Tạo một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
691 được chia sẻ và trả về một proxy cho nóSemaphore([giá trị])¶
Tạo một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
506 được chia sẻ và trả về một proxy cho nóMảng(mã loại , trình tự)¶
Tạo một mảng và trả về một proxy cho nó
Giá trị(mã loại , giá trị)¶
Tạo một đối tượng có thuộc tính
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
544 có thể ghi và trả về một proxy cho đối tượng đódict() ¶ dict(mapping)dict(sequence)
Tạo đối tượng
[1,4,9]
13 được chia sẻ và trả lại proxy cho đối tượng đódanh sách() ¶ danh sách(sequence)
Tạo đối tượng
[1,4,9]
12 được chia sẻ và trả lại proxy cho đối tượng đó
Đã thay đổi trong phiên bản 3. 6. Các đối tượng được chia sẻ có khả năng được lồng vào nhau. Ví dụ: đối tượng vùng chứa được chia sẻ, chẳng hạn như danh sách được chia sẻ, có thể chứa các đối tượng được chia sẻ khác, tất cả sẽ được quản lý và đồng bộ hóa bởi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
563. lớpđa xử lý. quản lý. Không gian tên ¶
Một loại có thể đăng ký với
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
563
Một đối tượng không gian tên không có phương thức công khai, nhưng có các thuộc tính có thể ghi. Đại diện của nó cho thấy các giá trị của các thuộc tính của nó
Tuy nhiên, khi sử dụng proxy cho đối tượng không gian tên, thuộc tính bắt đầu bằng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
594 sẽ là thuộc tính của proxy chứ không phải thuộc tính của tham chiếu
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
56
Trình quản lý tùy chỉnh¶
Để tạo trình quản lý của riêng mình, một người tạo một lớp con của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
25 để đăng ký các loại hoặc khả năng gọi mới với lớp trình quản lý. Ví dụ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
57
Sử dụng trình quản lý từ xa¶
Có thể chạy máy chủ quản lý trên một máy và để khách hàng sử dụng nó từ các máy khác (giả sử rằng tường lửa có liên quan cho phép điều đó)
Chạy các lệnh sau sẽ tạo một máy chủ cho một hàng đợi được chia sẻ duy nhất mà các máy khách từ xa có thể truy cập
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
58
Một khách hàng có thể truy cập máy chủ như sau
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
59
Một khách hàng khác cũng có thể sử dụng nó
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
60
Các quy trình cục bộ cũng có thể truy cập hàng đợi đó, sử dụng mã từ phía trên trên máy khách để truy cập từ xa
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
61
Đối tượng ủy quyền¶
Proxy là một đối tượng đề cập đến một đối tượng được chia sẻ tồn tại (có lẽ) trong một quy trình khác. Đối tượng được chia sẻ được cho là tham chiếu của proxy. Nhiều đối tượng proxy có thể có cùng một tham chiếu
Một đối tượng proxy có các phương thức gọi các phương thức tương ứng của tham chiếu của nó (mặc dù không phải mọi phương thức của tham chiếu đều nhất thiết phải có sẵn thông qua proxy). Bằng cách này, một proxy có thể được sử dụng giống như người tham chiếu của nó có thể
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
Một tính năng quan trọng của các đối tượng proxy là chúng có thể chọn được để chúng có thể được chuyển giữa các quy trình. Như vậy, một tham chiếu có thể chứa Đối tượng proxy . Điều này cho phép lồng các danh sách được quản lý này, lệnh và các Đối tượng proxy khác.
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
63
Tương tự, proxy dict và list có thể được lồng vào nhau
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
64
Nếu các đối tượng tiêu chuẩn (không phải proxy)
[1,4,9]
12 hoặc
[1,4,9]
13 được chứa trong một tham chiếu, các sửa đổi đối với các giá trị có thể thay đổi đó sẽ không được truyền qua trình quản lý vì proxy không có cách nào biết khi nào các giá trị chứa trong đó được sửa đổi. Tuy nhiên, việc lưu trữ một giá trị trong proxy vùng chứa (kích hoạt
30 trên đối tượng proxy) sẽ lan truyền qua trình quản lý và do đó, để sửa đổi mục đó một cách hiệu quả, người ta có thể gán lại giá trị đã sửa đổi cho proxy vùng chứa
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
65
Cách tiếp cận này có lẽ kém thuận tiện hơn so với việc sử dụng Đối tượng proxy lồng nhau cho hầu hết các trường hợp sử dụng nhưng cũng thể hiện mức độ kiểm soát đối với quá trình đồng bộ hóa.
6 không làm gì để hỗ trợ so sánh theo giá trị. Vì vậy, ví dụ, chúng ta có
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
66
Thay vào đó, người ta chỉ nên sử dụng một bản sao của người giới thiệu khi so sánh
lớpđa xử lý. quản lý. Proxy cơ sở ¶
Các đối tượng proxy là thể hiện của các lớp con của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
588_callmethod(tên phương thức[ , args[, kwds]])¶
Gọi và trả về kết quả của một phương thức tham chiếu của proxy
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
67
sẽ đánh giá biểu thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
68
trong quy trình của nhà quản lý
Giá trị được trả về sẽ là bản sao kết quả của lệnh gọi hoặc proxy cho một đối tượng được chia sẻ mới – xem tài liệu về đối số method_to_typeid của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
69_getvalue() ¶
Trả lại một bản sao của người giới thiệu
Nếu người giới thiệu không thể chọn được thì điều này sẽ đưa ra một ngoại lệ
__repr__() ¶
Trả về một đại diện của đối tượng proxy
__str__() ¶
Trả về đại diện của tham chiếu
Dọn dẹp¶
Một đối tượng proxy sử dụng một cuộc gọi lại yếu để khi nó được thu gom rác, nó sẽ tự hủy đăng ký khỏi trình quản lý sở hữu tham chiếu của nó
Một đối tượng được chia sẻ sẽ bị xóa khỏi quy trình quản lý khi không còn bất kỳ proxy nào đề cập đến nó
Nhóm quy trình¶
Người ta có thể tạo một nhóm các quy trình sẽ thực hiện các tác vụ được gửi cho nó với lớp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
Một đối tượng nhóm quy trình kiểm soát nhóm quy trình công nhân mà công việc có thể được gửi tới. Nó hỗ trợ các 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
quy trình là số lượng quy trình công nhân để sử dụng. Nếu các quy trình là
[1,4,9]
33 thì số được trả về bởi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
579 được sử dụng
Nếu trình khởi tạo không phải là
[1,4,9]
33 thì mỗi worker process sẽ gọi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
578 khi nó bắt đầu
maxtasksperchild là số lượng tác vụ mà một worker process có thể hoàn thành trước khi nó thoát và được thay thế bằng một worker process mới, để cho phép giải phóng các tài nguyên không sử dụng. Maxtaskperchild mặc định là
[1,4,9]
33, có nghĩa là worker process sẽ tồn tại miễn là pool
bối cảnh có thể được sử dụng để chỉ định bối cảnh được sử dụng để bắt đầu các quy trình worker. Thông thường, một nhóm được tạo bằng cách sử dụng hàm
48 có tài nguyên nội bộ cần được quản lý đúng cách (giống như bất kỳ tài nguyên nào khác) bằng cách sử dụng nhóm làm trình quản lý bối cảnh hoặc bằng cách gọi thủ công
[1,4,9]
75 và
[1,4,9]
71. Không làm điều này có thể dẫn đến quá trình bị treo khi quyết toán
Lưu ý rằng việc dựa vào trình thu gom rác để phá hủy nhóm là không chính xác vì CPython không đảm bảo rằng trình hoàn thiện của nhóm sẽ được gọi (xem
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5 thường tồn tại trong toàn bộ thời lượng của hàng đợi công việc của Nhóm. Một mô hình phổ biến được tìm thấy trong các hệ thống khác (chẳng hạn như Apache, mod_wsgi, v.v.) để giải phóng tài nguyên do công nhân nắm giữ là cho phép một công nhân trong nhóm chỉ hoàn thành một lượng công việc nhất định trước khi thoát, được dọn sạch và một quy trình mới được sinh ra . Đối số maxtasksperchild cho
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5 hiển thị khả năng này cho người dùng cuốiáp dụng(chức năng[ , args[, kwds]])¶
Gọi func với đối số args và đối số từ khóa kwds. Nó chặn cho đến khi kết quả sẵn sàng. Với các khối này,
54 phù hợp hơn để thực hiện công việc song song. Ngoài ra, func chỉ được thực thi ở một trong các công nhân của nhómapply_async(func[ , args[, kwds[, callback[, error_callback]]]])¶
Nếu gọi lại được chỉ định thì nó phải là một cuộc gọi có thể chấp nhận một đối số. Khi kết quả sẵn sàng gọi lại được áp dụng cho nó, đó là trừ khi cuộc gọi không thành công, trong trường hợp đó, error_callback được áp dụng thay thế
Nếu error_callback được chỉ định thì nó phải là một đối số có thể gọi được chấp nhận một đối số. Nếu chức năng đích không thành công, thì error_callback được gọi với trường hợp ngoại lệ
Các cuộc gọi lại phải hoàn thành ngay lập tức vì nếu không thì chuỗi xử lý kết quả sẽ bị chặn
map(func , có thể lặp lại[, chunksize])¶
Tương đương song song với chức năng tích hợp sẵn của
Phương pháp này cắt iterable thành một số khối mà nó gửi đến nhóm quy trình dưới dạng các tác vụ riêng biệt. Kích thước (gần đúng) của các khối này có thể được chỉ định bằng cách đặt kích thước khối thành một số nguyên dương
Lưu ý rằng nó có thể gây ra việc sử dụng bộ nhớ cao cho các lần lặp rất dài. Cân nhắc sử dụng
Nếu gọi lại được chỉ định thì nó phải là một cuộc gọi có thể chấp nhận một đối số. Khi kết quả sẵn sàng gọi lại được áp dụng cho nó, đó là trừ khi cuộc gọi không thành công, trong trường hợp đó, error_callback được áp dụng thay thế
Nếu error_callback được chỉ định thì nó phải là một đối số có thể gọi được chấp nhận một đối số. Nếu chức năng đích không thành công, thì error_callback được gọi với trường hợp ngoại lệ
Các cuộc gọi lại phải hoàn thành ngay lập tức vì nếu không thì chuỗi xử lý kết quả sẽ bị chặn
59 ngoại trừ thứ tự của kết quả từ trình vòng lặp được trả về nên được coi là tùy ý. (Chỉ khi chỉ có một worker process thì lệnh mới được đảm bảo là “đúng”. )starmap(func , có thể lặp lại[, chunksize])¶
76 lặp đi lặp lại trên iterable của iterables và gọi func với iterables được giải nén. Trả về một đối tượng kết quả
Mới trong phiên bản 3. 3
đóng() ¶
Ngăn chặn bất kỳ nhiệm vụ nào khác được gửi đến nhóm. Khi tất cả các tác vụ đã được hoàn thành, các quy trình công nhân sẽ thoát
chấm dứt() ¶
Dừng quy trình công nhân ngay lập tức mà không hoàn thành công việc chưa hoàn thành. Khi đối tượng pool được thu gom rác,
[1,4,9]
71 sẽ được gọi ngay lập tứctham gia() ¶
Chờ các worker process thoát ra. Người ta phải gọi
[1,4,9]
75 hoặc
[1,4,9]
71 trước khi sử dụng
[1,4,9]
48
Mới trong phiên bản 3. 3. Các đối tượng nhóm hiện hỗ trợ giao thức quản lý bối cảnh – xem Các loại trình quản lý bối cảnh .
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
650 trả về đối tượng pool và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
70 được nâng lên. Nếu cuộc gọi từ xa đưa ra một ngoại lệ thì ngoại lệ đó sẽ được đưa ra lại trước
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
560chờ([hết giờ])¶
Đợi cho đến khi có kết quả hoặc cho đến khi hết giây
sẵn sàng() ¶
Quay lại xem cuộc gọi đã hoàn thành chưa
thành công() ¶
Trả lại xem cuộc gọi có hoàn thành mà không đưa ra ngoại lệ hay không. Sẽ tăng
[1,4,9]
74 nếu kết quả chưa sẵn sàng
Đã thay đổi trong phiên bản 3. 7. Nếu kết quả chưa sẵn sàng,
[1,4,9]
74 được nâng lên thay vì
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
538.
Ví dụ sau minh họa việc sử dụng pool
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
50
Người nghe và Khách hàng¶
Thông thường, việc chuyển thông báo giữa các quy trình được thực hiện bằng cách sử dụng hàng đợi hoặc bằng cách sử dụng các đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
514 được trả về bởi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
94 cho phép linh hoạt hơn. Về cơ bản, nó cung cấp API định hướng thông báo cấp cao để xử lý các ổ cắm hoặc đường ống có tên Windows. Nó cũng có hỗ trợ xác thực thông báo bằng cách sử dụng mô-đun
96 được nâng lênđa xử lý. sự liên quan. Khách hàng(địa chỉ[ , family[, authkey]])¶
Cố gắng thiết lập kết nối với người nghe đang sử dụng địa chỉ address, trả về
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
514
Loại kết nối được xác định bởi đối số họ, nhưng điều này thường có thể được bỏ qua vì nó thường có thể được suy ra từ định dạng địa chỉ. (Xem Định dạng địa chỉ )
Nếu authkey được cung cấp và không phải là Không có, thì đó phải là một chuỗi byte và sẽ được sử dụng làm khóa bí mật cho thử thách xác thực dựa trên HMAC. Không có xác thực nào được thực hiện nếu authkey là Không có.
96 được nâng lên nếu xác thực không thành công. Xem Khóa xác thực . lớpđa xử lý. sự liên quan. Người nghe([địa chỉ[, family[, backlog[, authkey]]]])¶
Trình bao bọc cho ổ cắm bị ràng buộc hoặc đường ống có tên Windows đang 'lắng nghe' các kết nối
địa chỉ là địa chỉ được sử dụng bởi ổ cắm bị ràng buộc hoặc đường ống có tên của đối tượng người nghe
Ghi chú
Nếu một địa chỉ của '0. 0. 0. 0' được sử dụng, địa chỉ sẽ không phải là điểm cuối có thể kết nối trên Windows. Nếu bạn yêu cầu điểm cuối có thể kết nối, bạn nên sử dụng '127. 0. 0. 1’
họ là loại ổ cắm (hoặc ống có tên) sẽ sử dụng. Đây có thể là một trong các chuỗi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
00 (đối với ổ cắm TCP),
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
01 (đối với ổ cắm tên miền Unix) hoặc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
02 (đối với đường ống có tên Windows). Trong số này chỉ có cái đầu tiên được đảm bảo có sẵn. Nếu họ là
[1,4,9]
33 thì họ được suy ra từ dạng địa chỉ. Nếu địa chỉ cũng là
[1,4,9]
33 thì giá trị mặc định được chọn. Mặc định này là họ được coi là nhanh nhất hiện có. Xem Định dạng địa chỉ . Lưu ý rằng nếu họ là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
01 và địa chỉ là
[1,4,9]
33 thì ổ cắm sẽ được tạo trong một thư mục tạm thời riêng được tạo bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
07.
Nếu đối tượng người nghe sử dụng ổ cắm thì tồn đọng (1 theo mặc định) được chuyển đến phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
08 của ổ cắm sau khi nó đã được liên kết
Nếu authkey được cung cấp và không phải là Không có, thì đó phải là một chuỗi byte và sẽ được sử dụng làm khóa bí mật cho thử thách xác thực dựa trên HMAC. Không có xác thực nào được thực hiện nếu authkey là Không có.
96 được nâng lên nếu xác thực không thành công. Xem Khóa xác thực . chấp nhận() ¶
Chấp nhận kết nối trên ổ cắm bị ràng buộc hoặc đường ống có tên của đối tượng người nghe và trả về đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
514. Nếu xác thực được thử và không thành công, thì
Đóng ổ cắm bị ràng buộc hoặc đường ống có tên của đối tượng người nghe. Điều này được gọi tự động khi người nghe được thu gom rác. Tuy nhiên, nên gọi nó một cách rõ ràng
Các đối tượng người nghe có các thuộc tính chỉ đọc sau
địa chỉ ¶
Địa chỉ đang được sử dụng bởi đối tượng Listener
last_accepted ¶
Địa chỉ mà từ đó kết nối được chấp nhận cuối cùng đến. Nếu cái này không có thì nó là
[1,4,9]
33
Mới trong phiên bản 3. 3. Các đối tượng trình nghe hiện hỗ trợ giao thức quản lý bối cảnh – xem Các loại trình quản lý bối cảnh .
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
650 trả về đối tượng người nghe và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
651 gọi
[1,4,9]
75. đa xử lý. sự liên quan. chờ đã(object_list , hết thời gian=None)¶
Đợi cho đến khi một đối tượng trong object_list sẵn sàng. Trả về danh sách các đối tượng đó trong object_list đã sẵn sàng. Nếu thời gian chờ là thời gian trôi nổi thì cuộc gọi sẽ chặn nhiều nhất là bao nhiêu giây. Nếu thời gian chờ là
[1,4,9]
33 thì nó sẽ bị chặn trong một khoảng thời gian không giới hạn. Thời gian chờ âm tương đương với thời gian chờ bằng 0
Đối với cả Unix và Windows, một đối tượng có thể xuất hiện trong object_list nếu nó
một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
514 có thể đọc được;
một đối tượng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
18 được kết nối và có thể đọc được;
thuộc tính
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
19 của đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0
Một đối tượng kết nối hoặc ổ cắm đã sẵn sàng khi có sẵn dữ liệu để đọc từ nó hoặc đầu kia đã bị đóng
Unix.
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
21 gần như tương đương
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
22. Sự khác biệt là, nếu
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
23 bị gián đoạn bởi tín hiệu, nó có thể tăng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
546 với số lỗi là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
25, trong khi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
26 thì không
các cửa sổ. Một mục trong object_list phải là một số nguyên xử lý có thể đợi được (theo định nghĩa được sử dụng bởi tài liệu về hàm Win32 ________ ____ ____ _ ____ _ _ nó có thể là một đối tượng có phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
28 trả về một tay cầm ổ cắm hoặc tay cầm ống. (Lưu ý rằng tay cầm ống và tay cầm ổ cắm không phải là tay cầm có thể chờ được. )
Mới trong phiên bản 3. 3
ví dụ
Mã máy chủ sau đây tạo một trình lắng nghe sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
29 làm khóa xác thực. Sau đó, nó chờ kết nối và gửi một số dữ liệu đến máy khách
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
51
Đoạn mã sau kết nối với máy chủ và nhận một số dữ liệu từ máy chủ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
52
Đoạn mã sau sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
26 để đợi tin nhắn từ nhiều quy trình cùng một lúc
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
53
Định dạng địa chỉ¶
Địa chỉ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
00 là một bộ có dạng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
32 trong đó tên máy chủ là một chuỗi và cổng là một số nguyên
Địa chỉ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
01 là một chuỗi đại diện cho tên tệp trên hệ thống tệp
Địa chỉ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
02 là một chuỗi có dạng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
35. Để sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
36 để kết nối với một đường ống có tên trên máy tính từ xa có tên ServerName, thay vào đó, bạn nên sử dụng một địa chỉ có dạng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
37
Lưu ý rằng bất kỳ chuỗi nào bắt đầu bằng hai dấu gạch chéo ngược được mặc định là địa chỉ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
02 thay vì địa chỉ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
01
Khóa xác thực¶
Khi một người sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
40, dữ liệu nhận được sẽ tự động được giải nén. Thật không may, việc giải nén dữ liệu từ một nguồn không đáng tin cậy là một rủi ro bảo mật. Do đó,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
41 và
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
Khóa xác thực là một chuỗi byte có thể được coi là mật khẩu. khi kết nối được thiết lập, cả hai đầu sẽ yêu cầu bằng chứng rằng đầu kia biết khóa xác thực. (Chứng minh rằng cả hai đầu đang sử dụng cùng một khóa không liên quan đến việc gửi khóa qua kết nối. )
Nếu xác thực được yêu cầu nhưng không có khóa xác thực nào được chỉ định thì giá trị trả về của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
569 sẽ được sử dụng (xem
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0). Giá trị này sẽ được tự động kế thừa bởi bất kỳ đối tượng
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 nào mà quy trình hiện tại tạo ra. Điều này có nghĩa là (theo mặc định) tất cả các quy trình của chương trình đa quy trình sẽ chia sẻ một khóa xác thực duy nhất có thể được sử dụng khi thiết lập kết nối giữa chúng
Các khóa xác thực phù hợp cũng có thể được tạo bằng cách sử dụng
[1,4,9]
61
Ghi nhật ký¶
Một số hỗ trợ cho ghi nhật ký có sẵn. Tuy nhiên, lưu ý rằng gói
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
48 không sử dụng khóa chia sẻ quy trình nên có thể (tùy thuộc vào loại trình xử lý) các thông báo từ các quy trình khác nhau bị lẫn lộnđa xử lý. get_logger() ¶
Khi được tạo lần đầu, bộ ghi có cấp độ 150 và không có trình xử lý mặc định. Theo mặc định, các tin nhắn được gửi tới bộ ghi này sẽ không lan truyền tới bộ ghi gốc
Lưu ý rằng trên Windows, các tiến trình con sẽ chỉ kế thừa cấp độ của trình ghi nhật ký của tiến trình cha – bất kỳ tùy chỉnh nào khác của trình ghi nhật ký sẽ không được kế thừa
đa xử lý. log_to_stderr(cấp độ=Không có)¶
Hàm này thực hiện lệnh gọi tới
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
51 nhưng ngoài việc trả về trình ghi nhật ký được tạo bởi get_logger, hàm này còn thêm một trình xử lý gửi đầu ra tới
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
52 bằng định dạng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
53. Bạn có thể sửa đổi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
54 của bộ ghi nhật ký bằng cách chuyển đối số
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
55
Dưới đây là phiên ví dụ có bật ghi nhật ký
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
54
Để biết bảng đầy đủ các cấp độ ghi nhật ký, hãy xem mô-đun
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
48
Mô-đun from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print(q.get()) # prints "[42, None, 'hello']"
p.join()
57¶
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
6 nhưng không hơn gì một trình bao bọc xung quanh mô-đun
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
0
Đặc biệt, hàm
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5 do
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
57 cung cấp trả về một thể hiện của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
63, là một lớp con của
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5 hỗ trợ tất cả các lời gọi phương thức giống nhau nhưng sử dụng một nhóm các chuỗi công nhân thay vì các quy trình công nhânlớpđa xử lý. hồ bơi. ThreadPool([quy trình[, initializer[, initargs]]])¶
Một đối tượng nhóm luồng kiểm soát nhóm luồng công nhân mà công việc có thể được gửi tới. Các phiên bản
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
63 hoàn toàn có giao diện tương thích với các phiên bản
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5 và tài nguyên của chúng cũng phải được quản lý đúng cách, bằng cách sử dụng nhóm làm trình quản lý ngữ cảnh hoặc bằng cách gọi thủ công
[1,4,9]
75 và
[1,4,9]
71
quy trình là số lượng luồng công nhân sẽ sử dụng. Nếu các quy trình là
[1,4,9]
33 thì số được trả về bởi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
579 được sử dụng
Nếu trình khởi tạo không phải là
[1,4,9]
33 thì mỗi worker process sẽ gọi
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
578 khi nó bắt đầu
Không giống như
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5, không thể cung cấp maxt taskperchild và ngữ cảnh
Ghi chú
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
63 chia sẻ giao diện giống như
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
5, được thiết kế xung quanh một nhóm các quy trình và có trước khi giới thiệu mô-đun
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
9. Do đó, nó kế thừa một số thao tác không có ý nghĩa đối với nhóm được hỗ trợ bởi các luồng và nó có loại riêng để biểu thị trạng thái của các công việc không đồng bộ,
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
78, có giao diện đơn giản hơn được thiết kế xung quanh các luồng ngay từ đầu và trả về các phiên bản
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
79 tương thích với nhiều thư viện khác, bao gồm cả
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
80
Hướng dẫn lập trình¶
Có một số nguyên tắc và thành ngữ cần được tuân thủ khi sử dụng
Những điều sau đây áp dụng cho tất cả các phương pháp bắt đầu
Tránh trạng thái chia sẻ
Càng nhiều càng tốt, người ta nên cố gắng tránh chuyển một lượng lớn dữ liệu giữa các quy trình
Có lẽ tốt nhất là nên sử dụng hàng đợi hoặc đường ống để liên lạc giữa các quy trình thay vì sử dụng các nguyên mẫu đồng bộ hóa cấp thấp hơn
độ chua
Đảm bảo rằng các đối số cho các phương thức của proxy có thể chọn được
Chủ đề an toàn của proxy
Không sử dụng đối tượng proxy từ nhiều luồng trừ khi bạn bảo vệ nó bằng khóa
(Không bao giờ có vấn đề với các quy trình khác nhau sử dụng cùng một proxy. )
Tham gia các quá trình zombie
Trên Unix khi một quá trình kết thúc nhưng chưa được kết nối, nó sẽ trở thành một thây ma. Không bao giờ nên có quá nhiều vì mỗi khi một quy trình mới bắt đầu (hoặc gọi là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
82) thì tất cả các quy trình đã hoàn thành chưa được tham gia sẽ được tham gia. Đồng thời gọi một quy trình đã hoàn thành là
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
83 sẽ tham gia quy trình. Mặc dù vậy, có lẽ nên tham gia một cách rõ ràng tất cả các quy trình mà bạn bắt đầu
Kế thừa tốt hơn là dưa chua/bỏ dưa chua
Khi sử dụng các phương thức khởi động spawn hoặc forkserver, nhiều loại từ
6 cần phải được chọn để các tiến trình con có thể sử dụng chúng. Tuy nhiên, nói chung nên tránh gửi các đối tượng được chia sẻ đến các quy trình khác bằng cách sử dụng đường ống hoặc hàng đợi. Thay vào đó, bạn nên sắp xếp chương trình sao cho một quy trình cần truy cập vào tài nguyên được chia sẻ được tạo ở nơi khác có thể kế thừa nó từ quy trình tổ tiên
Tránh chấm dứt quá trình
Việc sử dụng phương pháp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
85 để dừng một quy trình có thể khiến bất kỳ tài nguyên dùng chung nào (chẳng hạn như khóa, semaphores, đường ống và hàng đợi) hiện đang được quy trình sử dụng bị hỏng hoặc không khả dụng đối với các quy trình khác
Do đó, có lẽ tốt nhất là chỉ xem xét sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
85 trên các quy trình không bao giờ sử dụng bất kỳ tài nguyên được chia sẻ nào
Tham gia các quy trình sử dụng hàng đợi
Hãy nhớ rằng một quy trình đã đặt các mục vào hàng đợi sẽ đợi trước khi kết thúc cho đến khi tất cả các mục được lưu trong bộ đệm được luồng "bộ nạp" đưa vào đường ống bên dưới. (Tiến trình con có thể gọi phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
87 của hàng đợi để tránh hành vi này. )
Điều này có nghĩa là bất cứ khi nào bạn sử dụng hàng đợi, bạn cần đảm bảo rằng tất cả các mục đã được đưa vào hàng đợi cuối cùng sẽ bị xóa trước khi quy trình được tham gia. Nếu không, bạn không thể chắc chắn rằng các quy trình đã đặt các mục vào hàng đợi sẽ kết thúc. Cũng nên nhớ rằng các quy trình không phải daemon sẽ được tự động tham gia
Một ví dụ sẽ bế tắc như sau
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
55
Cách khắc phục ở đây là hoán đổi hai dòng cuối cùng (hoặc chỉ cần xóa dòng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
88)
Truyền rõ ràng tài nguyên cho các tiến trình con
Trên Unix sử dụng phương thức fork start, một tiến trình con có thể sử dụng tài nguyên được chia sẻ được tạo trong tiến trình cha bằng tài nguyên chung. Tuy nhiên, tốt hơn là truyền đối tượng làm đối số cho hàm tạo cho tiến trình con
Ngoài việc làm cho mã (có khả năng) tương thích với Windows và các phương thức bắt đầu khác, điều này còn đảm bảo rằng miễn là tiến trình con vẫn còn hoạt động, đối tượng sẽ không bị thu gom rác trong tiến trình cha. Điều này có thể quan trọng nếu một số tài nguyên được giải phóng khi đối tượng được thu gom rác trong quy trình gốc
Vì vậy, ví dụ
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
56
nên được viết lại như
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
57
Cẩn thận khi thay thế
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
58
trong phương pháp
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
91 - điều này dẫn đến các vấn đề với quy trình trong quy trình. Điều này đã được thay đổi thành
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
59
Điều này giải quyết vấn đề cơ bản của các quy trình va chạm với nhau dẫn đến lỗi bộ mô tả tệp không hợp lệ, nhưng lại gây ra mối nguy hiểm tiềm ẩn cho các ứng dụng thay thế
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
92 bằng một “đối tượng giống như tệp” với bộ đệm đầu ra. Mối nguy hiểm này là nếu nhiều quy trình gọi
[1,4,9]
75 trên đối tượng giống như tệp này, nó có thể dẫn đến việc cùng một dữ liệu được chuyển sang đối tượng nhiều lần, dẫn đến hỏng
Nếu bạn viết một đối tượng giống như tệp và triển khai bộ nhớ đệm của riêng mình, bạn có thể làm cho nó an toàn bằng cách lưu trữ pid bất cứ khi nào bạn thêm vào bộ đệm và loại bỏ bộ đệm khi pid thay đổi. Ví dụ
Để biết thêm thông tin, hãy xem bpo-5155, bpo-5313 và bpo-5331
Các phương thức bắt đầu spawn và forkserver¶
Có một số hạn chế bổ sung không áp dụng cho phương thức khởi động fork
dễ ăn hơn
Đảm bảo rằng tất cả các đối số của
[1,4,9]
43 đều có thể chọn được. Ngoài ra, nếu bạn phân lớp
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
0 thì hãy đảm bảo rằng các phiên bản đó sẽ có thể chọn được khi phương thức
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
96 được gọi
biến toàn cầu
Hãy nhớ rằng nếu mã chạy trong một tiến trình con cố gắng truy cập vào một biến toàn cục, thì giá trị mà nó thấy (nếu có) có thể không giống với giá trị trong tiến trình mẹ tại thời điểm mà
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
96 được gọi
Tuy nhiên, các biến toàn cục chỉ là hằng số cấp độ mô-đun không gây ra vấn đề gì
Nhập an toàn mô-đun chính
Đảm bảo rằng mô-đun chính có thể được nhập an toàn bằng trình thông dịch Python mới mà không gây ra các tác dụng phụ ngoài ý muốn (chẳng hạn như bắt đầu một quy trình mới)
Ví dụ: sử dụng phương thức khởi động spawn hoặc forkserver chạy mô-đun sau sẽ không thành công với
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
Thay vào đó, người ta nên bảo vệ “điểm vào” của chương trình bằng cách sử dụng
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()
588 nếu chương trình sẽ chạy bình thường thay vì đóng băng. )
Điều này cho phép trình thông dịch Python mới được tạo ra nhập mô-đun một cách an toàn và sau đó chạy hàm
frommultiprocessingimportProcess,Pipedeff(conn):conn.send([42,None,'hello'])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(target=f,args=(child_conn,))p.start()print(parent_conn.recv())# prints "[42, None, 'hello']"p.join()
01 của mô-đun
Áp dụng các hạn chế tương tự nếu một nhóm hoặc trình quản lý được tạo trong mô-đun chính
Ví dụ¶
Trình diễn cách tạo và sử dụng trình quản lý và proxy tùy chỉnh
frommultiprocessingimportProcess,Queuedeff(q):q.put([42,None,'hello'])if__name__=='__main__':q=Queue()p=Process(target=f,args=(q,))p.start()print(q.get())# prints "[42, None, 'hello']"p.join()