Làm cách nào để khởi động lại tập lệnh chương trình trong Python?

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ố

Chủ Đề