Tôi đã viết một số tập lệnh Python và triển khai "tự động cập nhật" tập lệnh này, để áp dụng các thay đổi trong thời gian chạy, tôi cần khởi động lại tập lệnh từ chính nó. Những kịch bản khởi động lại từ chính nó
import sys import os python = sys.executable os.execl[python, python, * sys.argv]
Bạn không thể khởi động lại một quy trình trong Python, thay vào đó bạn phải tạo và bắt đầu một quy trình mới với cùng cấu hình
Trong hướng dẫn này, bạn sẽ khám phá cách mô phỏng khởi động lại một quy trình trong Python
Bắt đầu nào
Mục lục
- Cần khởi động lại một quy trình
- Cách khởi động lại một quy trình
- Ví dụ về khởi động lại một quá trình đã kết thúc
- Ví dụ về khởi động lại quy trình với phiên bản mới
- Đọc thêm
- mang đi
Cần khởi động lại một quy trình
Một tiến trình là một thể hiện đang chạy của một chương trình máy tính
Mỗi chương trình Python được thực thi trong một Quy trình, đây là phiên bản mới của trình thông dịch Python. Quá trình này có tên MainProcess và có một luồng được sử dụng để thực hiện các hướng dẫn của chương trình được gọi là MainThread. Cả quy trình và luồng đều được tạo và quản lý bởi hệ điều hành bên dưới
Đôi khi chúng ta có thể cần tạo các tiến trình con mới trong chương trình của mình để thực thi mã đồng thời
Python cung cấp khả năng tạo và quản lý các quy trình mới thông qua cơ chế đa xử lý. lớp quy trình
Bạn có thể tìm hiểu thêm về đa xử lý trong hướng dẫn
- Đa xử lý trong Python. Hướng dẫn hoàn chỉnh
Có thể có trường hợp các quy trình mới của chúng tôi bị chấm dứt, thông thường bằng cách kết thúc quá trình thực hiện hoặc do phát sinh lỗi và chúng tôi cần khởi động lại chúng
Điều này có thể vì nhiều lý do như
- Quá trình thực hiện một hành động hữu ích mà chúng tôi muốn chạy định kỳ
- Quá trình này là một tác vụ nền daemon mà chúng tôi muốn luôn chạy
- Quá trình đang thực hiện một tác vụ có thể được khởi động lại từ một điểm kiểm tra
Một quy trình có thể được khởi động lại bằng Python không và nếu có thì bằng cách nào?
Chạy các vòng lặp của bạn bằng cách sử dụng tất cả các CPU, tải xuống cuốn sách MIỄN PHÍ của tôi để tìm hiểu cách thực hiện
Cách khởi động lại một quy trình
Quá trình Python không thể được khởi động lại hoặc sử dụng lại
Trên thực tế, đây có thể là một hạn chế về khả năng của các quy trình được cung cấp bởi hệ điều hành cơ bản
Khi một quá trình kết thúc, bạn không thể gọi lại phương thức start[] trên nó để sử dụng lại nó
Nhớ lại rằng một tiến trình có thể kết thúc vì nhiều lý do chẳng hạn như phát sinh lỗi hoặc ngoại lệ hoặc khi nó hoàn thành việc thực thi hàm run[] của nó
Gọi hàm start[] trên một quy trình đã kết thúc sẽ dẫn đến AssertionError cho biết rằng quy trình chỉ có thể được bắt đầu một lần
- Khẳng địnhLỗi. không thể bắt đầu một quá trình hai lần
Thay vào đó, để khởi động lại một quy trình trong Python, bạn phải tạo một phiên bản mới của quy trình có cùng cấu hình và sau đó gọi hàm start[]
Bây giờ chúng ta biết rằng chúng ta không thể khởi động lại một quy trình mà thay vào đó phải tạo lại và bắt đầu một quy trình mới, hãy xem một số ví dụ đã hoạt động
Bối rối với API mô-đun đa xử lý?
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi
Ví dụ về khởi động lại một quá trình đã kết thúc
Chúng ta có thể khám phá điều gì sẽ xảy ra khi chúng ta cố gắng bắt đầu một quá trình đã kết thúc trong Python
Trong ví dụ này, chúng tôi sẽ tạo một quy trình mới để thực thi chức năng tác vụ đích, đợi quy trình mới kết thúc, sau đó cố gắng khởi động lại nó một lần nữa. Chúng tôi hy vọng nó sẽ thất bại với AssertionError
Đầu tiên, hãy xác định chức năng nhiệm vụ mục tiêu để thực thi trong một quy trình mới
Đầu tiên, chức năng sẽ chặn trong giây lát, sau đó sẽ báo cáo một thông báo cho chúng tôi biết rằng quy trình mới đang được thực thi
1
2
3
4
5
6
# chức năng mục tiêu tùy chỉnh
def nhiệm vụ[].
# khối trong giây lát
ngủ[1]
# báo cáo thư
in['Xin chào từ quy trình mới']
Tiếp theo, quy trình chính sẽ tạo một thể hiện của đa xử lý. Xử lý lớp và định cấu hình nó để thực thi hàm task[] tùy chỉnh của chúng tôi thông qua từ khóa “mục tiêu”
1
2
3
.. .
# tạo quy trình mới
quy trình = Quy trình[mục tiêu=task]
Sau đó, chúng tôi bắt đầu thực hiện quy trình sẽ thực thi hàm run[] bên trong và lần lượt gọi hàm task[] tùy chỉnh của chúng tôi
1
2
3
.. .
# bắt đầu quá trình
quy trình. bắt đầu[]
Tiếp theo, quy trình cha tham gia quy trình con mới sẽ chặn [không quay lại] cho đến khi quy trình mới kết thúc
1
2
3
.. .
# đợi quá trình kết thúc
quy trình. tham gia[]
Cuối cùng, tiến trình cha sẽ cố gắng bắt đầu lại tiến trình đã kết thúc
1
2
3
.. .
# thử và bắt đầu lại quy trình
quy trình. bắt đầu[]
Liên kết điều này lại với nhau, ví dụ hoàn chỉnh được liệt kê bên dưới
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#Trăn Siêu Nhanh. com
# ví dụ về khởi động lại một tiến trình
từ thời gian nhập ngủ
từ đa xử lý nhập Quy trình
# chức năng mục tiêu tùy chỉnh
def nhiệm vụ[].
# khối trong giây lát
ngủ[1]
# báo cáo thư
in['Xin chào từ quy trình mới']
# điểm vào
if __name__ == '__main__'.
# tạo quy trình mới
quy trình = Quy trình[target=task]
# bắt đầu quá trình
quy trình. bắt đầu[]
# chờ quá trình hoàn tất
quy trình. tham gia[]
# hãy thử và bắt đầu lại quy trình
quy trình. bắt đầu[]
Chạy ví dụ trước tiên sẽ tạo một phiên bản quy trình, sau đó bắt đầu thực thi
Quá trình mới được bắt đầu, chặn một lúc sau đó báo cáo một tin nhắn
Tiến trình cha tham gia tiến trình mới và đợi nó kết thúc. Sau khi kết thúc, quy trình gốc sẽ cố gắng bắt đầu lại quy trình tương tự
Kết quả là một AssertionError, như chúng ta mong đợi
1
2
3
4
Xin chào từ quy trình mới
Traceback [cuộc gọi gần đây nhất cuối cùng]
Khẳng địnhLỗi. không thể bắt đầu một quá trình hai lần
Điều này nhấn mạnh rằng thực sự chúng ta không thể gọi phương thức start[] [e. g. khởi động lại] một quá trình đã kết thúc
Tiếp theo, hãy xem xét một cách tiếp cận khác để tạo một thể hiện quy trình mới
Khóa học đa xử lý Python miễn phí
Tải xuống bảng cheat API đa xử lý của tôi và như một phần thưởng, bạn sẽ nhận được quyền truy cập MIỄN PHÍ vào khóa học email 7 ngày của tôi
Khám phá cách sử dụng mô-đun đa xử lý Python, bao gồm cách tạo và bắt đầu các tiến trình con cũng như cách sử dụng khóa mutex và semaphores
Tìm hiểu thêm
Ví dụ về khởi động lại quy trình với phiên bản mới
Chúng tôi có thể mô phỏng khởi động lại một quy trình bằng cách tạo một quy trình mới có cùng cấu hình và thay vào đó khởi động nó
Một quy trình mới có cùng cấu hình có thể được tạo
Điều này liên quan đến các đối số cho đa xử lý. Trình xây dựng lớp quy trình, chẳng hạn như
- chức năng mục tiêu
- Đối số chức năng mục tiêu [tuple hoặc dict]
- Tên
- yêu tinh
Nếu chúng tôi xem xét mã nguồn cho đa xử lý. Process, chúng ta có thể thấy rằng các đối số được lưu trữ bên trong quy trình, mặc dù là riêng tư với các tên như _name, _target, _args, v.v.
Thay vì cố gắng truy cập các thuộc tính riêng tư này, thay vào đó, chúng ta có thể tạo một thể hiện quy trình mới và chỉ định các đối số cho hàm tạo theo cách thủ công
1
2
3
.. .
# tạo một quy trình mới với cùng cấu hình
quy trình2 = Quy trình[mục tiêu=task]
Sau đó bắt đầu nó và tham gia nó như trước
1
2
3
4
5
.. .
# bắt đầu quy trình mới
quy trình2. bắt đầu[]
# đợi quá trình mới kết thúc
quy trình2. tham gia[]
Do chúng ta phải định cấu hình thủ công một phiên bản quy trình mới, nên có thể sử dụng một hàm xuất xưởng trả về một phiên bản quy trình mới với cấu hình ưu tiên trong những trường hợp có thể cần phải khởi động lại quy trình
Ví dụ
1
2
3
# nhà máy để tạo quy trình được định cấu hình theo cách chúng tôi muốn
def create_process[]
return Quy trình[mục tiêu=task]
Chúng tôi sẽ không sử dụng chức năng xuất xưởng trong trường hợp này vì quy trình của chúng tôi có cấu hình đơn giản
Liên kết điều này lại với nhau, ví dụ hoàn chỉnh về mô phỏng quá trình khởi động lại bằng một phiên bản mới được liệt kê bên dưới
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#Trăn Siêu Nhanh. com
# ví dụ về khởi động lại một tiến trình
từ thời gian nhập ngủ
từ đa xử lý nhập Quy trình
# chức năng mục tiêu tùy chỉnh
def nhiệm vụ[].
# khối trong giây lát
ngủ[1]
# báo cáo thư
in['Xin chào từ quy trình mới']
# điểm vào
if __name__ == '__main__'.
# tạo quy trình mới
quy trình = Quy trình[target=task]
# bắt đầu quá trình
quy trình. bắt đầu[]
# chờ quá trình hoàn tất
quy trình. tham gia[]
# tạo quy trình mới có cùng cấu hình
quy trình2 = Quy trình[target=task]
# bắt đầu quy trình mới
quy trình2. bắt đầu[]
# chờ quá trình mới kết thúc
quy trình2. tham gia[]
Chạy ví dụ trước tiên sẽ tạo quy trình và chạy nó như trước
Quá trình cha tham gia quá trình con mới cho đến khi nó kết thúc
Sau đó, tiến trình cha tạo một thể hiện tiến trình con mới có cùng cấu hình, khởi động nó và kết nối nó. Như chúng tôi mong đợi, quy trình mới này thực thi mà không có sự cố