Hướng dẫn python interrupt main thread - python làm gián đoạn chuỗi chính

Bạn có thể làm gián đoạn chủ đề chính thông qua hàm _Thread.Interrupt_main ().interrupt the main thread via the _thread.interrupt_main() function.

Trong hướng dẫn này, bạn sẽ khám phá cách làm gián đoạn chủ đề chính từ một chủ đề khác trong Python.interrupt the main thread from another thread in Python.

Bắt đầu nào.

  • Cần làm gián đoạn chủ đề chính
  • Cách làm gián đoạn chủ đề chính
  • Ngắt chủ đề chính và xử lý với ngoại lệ
  • Ngắt chủ đề chính và xử lý với trình xử lý tín hiệu
  • Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính
  • Đọc thêm
  • Takeaways

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.thread of execution in a computer program.

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời.

Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô -đun luồng và lớp luồng.threading.Thread class.

Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:

  • Chủ đề trong Python: Hướng dẫn hoàn chỉnh

Trong lập trình đồng thời, chúng ta có thể cần phải làm gián đoạn luồng chính từ một luồng khác.

Điều này có thể là vì nhiều lý do, chẳng hạn như:

  • Một thay đổi lớn cho chương trình hoặc hệ thống bên ngoài.
  • Một yêu cầu từ người dùng hoặc hệ thống khác.
  • Một tài nguyên không còn hợp lệ hoặc có sẵn.

Làm thế nào chúng ta có thể làm gián đoạn chủ đề chính từ một chủ đề khác?

Cách làm gián đoạn chủ đề chính

Ngắt chủ đề chính và xử lý với ngoại lệ_thread.interrupt_main() function.

Ngắt chủ đề chính và xử lý với trình xử lý tín hiệu

Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính

Đọc thêmsignal.SIGINT (interruption signal) that will be sent to the main thread. This is the signal sent when the user presses Ctrl-C on the command prompt.

Takeaways

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính...

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.

_thread.interrupt_main().interrupt_main()

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời._thread.interrupt_main() function.

Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô -đun luồng và lớp luồng.

Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính

Takeaways

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính...

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.

_thread.interrupt_main(signum=signal.SIGKILL).interrupt_main(signum=signal.SIGKILL)

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời.

Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô -đun luồng và lớp luồng.

Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:KeyboardInterrupt exception.

Takeaways

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính...

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.

try::

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính...

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.KeyboardInterrupt:

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời.

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính...

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.signal.SIGINT.

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời.signal.signal() function and specifying the signal number to handle and the function to handle it.

Takeaways

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.handle_sigint(signalnum,handler):

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời.

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính...

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời.

signal(SIGINT,handle_sigint)(SIGINT,handle_sigint)

Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô -đun luồng và lớp luồng.

Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:

Chủ đề trong Python: Hướng dẫn hoàn chỉnh

Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính

Đọc thêm

Takeaways

  • Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.
  • Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản.
  • Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng tôi để thực thi mã đồng thời.

Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô -đun luồng và lớp luồng.

  • Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:

Chủ đề trong Python: Hướng dẫn hoàn chỉnh

Trong lập trình đồng thời, chúng ta có thể cần phải làm gián đoạn luồng chính từ một luồng khác.
Download my FREE PDF cheat sheet

Ngắt chủ đề chính và xử lý với ngoại lệ

Điều này có thể là vì nhiều lý do, chẳng hạn như:

Một thay đổi lớn cho chương trình hoặc hệ thống bên ngoài.

Một yêu cầu từ người dùng hoặc hệ thống khác.

Một tài nguyên không còn hợp lệ hoặc có sẵn.time.sleep() function for three seconds. It will then report a message that it is interrupting the main thread, then calls the _thread.interrupt_main() function.

Hàm nhiệm vụ () bên dưới thực hiện điều này.

# Nhiệm vụ được thực thi trong một luồng mới

nhiệm vụ def ():task():

& nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment

    sleep(3)sleep(3)

& nbsp; & nbsp; & nbsp; & nbsp;# ngắt luồng chính# interrupt the main thread

& nbsp; & nbsp; & nbsp; & nbsp; in ('làm gián đoạn chủ đề chính ngay')print('Interrupting main thread now')

    interrupt_main()interrupt_main()

Tiếp theo, trong luồng chính, chúng tôi sẽ tạo một phiên bản mới. Chủ đề và định cấu hình nó để thực thi hàm Task (). Chủ đề sau đó có thể được bắt đầu bằng cách gọi hàm start ().threading.Thread instance and configure it to execute the task() function. The thread can then be started by calling the start() function.

.....

# Bắt đầu chủ đề mới

thread=Thread(target=task)=Thread(target=task)

thread.start().start()

Sau đó, chúng ta có thể chấp nhận tín hiệu SIGINT vì bị gián đoạn và sử dụng mẫu thử nghiệm thử để bắt một bàn phím tăng lên.KeyboardInterrupt.

Trong phần thân của Try-Except sẽ chặn mãi mãi để mô phỏng công việc, in một tin nhắn và ngủ trong nửa giây mỗi lần lặp.

Bàn phím được xử lý bằng cách in tin nhắn và chấm dứt luồng bằng một cuộc gọi đến hàm sys.exit ().KeyboardInterrupt is handled by printing a message and terminating the thread with a call to the sys.exit() function.

.....

# Bắt đầu chủ đề mới

try::

Sau đó, chúng ta có thể chấp nhận tín hiệu SIGINT vì bị gián đoạn và sử dụng mẫu thử nghiệm thử để bắt một bàn phím tăng lên.# wait around

    whileTrue:whileTrue:

Trong phần thân của Try-Except sẽ chặn mãi mãi để mô phỏng công việc, in một tin nhắn và ngủ trong nửa giây mỗi lần lặp.print('Main thread waiting...')

        sleep(0.5)sleep(0.5)

Bàn phím được xử lý bằng cách in tin nhắn và chấm dứt luồng bằng một cuộc gọi đến hàm sys.exit ().KeyboardInterrupt:

# Xử lý bị gián đoạn# terminate main thread

& nbsp; & nbsp; & nbsp; & nbsp;# chờ xung quanhprint('Main interrupted! Exiting.')

    sys.exit()sys.exit()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

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

27

28

ngoại trừ bàn phím interrupt:

& nbsp; & nbsp; & nbsp; & nbsp;# chấm dứt chủ đề chính

& nbsp; & nbsp; & nbsp; & nbsp; in ('bị gián đoạn chính! thoát.')time import sleep

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.threading import Thread

# SuperfastPython.com_thread import interrupt_main

# Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Exceptsys

# Nhiệm vụ được thực thi trong một luồng mới

nhiệm vụ def ():task():

& nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment

    sleep(3)sleep(3)

& nbsp; & nbsp; & nbsp; & nbsp;# ngắt luồng chính# interrupt the main thread

& nbsp; & nbsp; & nbsp; & nbsp; in ('làm gián đoạn chủ đề chính ngay')print('Interrupting main thread now')

    interrupt_main()interrupt_main()

# Bắt đầu chủ đề mới

thread=Thread(target=task)=Thread(target=task)

thread.start().start()

# Bắt đầu chủ đề mới

try::

Sau đó, chúng ta có thể chấp nhận tín hiệu SIGINT vì bị gián đoạn và sử dụng mẫu thử nghiệm thử để bắt một bàn phím tăng lên.# wait around

    whileTrue:while True:

Trong phần thân của Try-Except sẽ chặn mãi mãi để mô phỏng công việc, in một tin nhắn và ngủ trong nửa giây mỗi lần lặp.print('Main thread waiting...')

        sleep(0.5)sleep(0.5)

Bàn phím được xử lý bằng cách in tin nhắn và chấm dứt luồng bằng một cuộc gọi đến hàm sys.exit ().KeyboardInterrupt:

# Xử lý bị gián đoạn# terminate main thread

& nbsp; & nbsp; & nbsp; & nbsp;# chờ xung quanhprint('Main interrupted! Exiting.')

    sys.exit()sys.exit()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

ngoại trừ bàn phím interrupt:

& nbsp; & nbsp; & nbsp; & nbsp;# chấm dứt chủ đề chính

& nbsp; & nbsp; & nbsp; & nbsp; in ('bị gián đoạn chính! thoát.')KeyboardInterrupt

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.

# SuperfastPython.com

# Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except

# Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except

# Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except

# Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except

# Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except

# Ví dụ về việc gián đoạn chủ đề chính và xử lý với Try-Except

từ thời gian nhập vào giấc ngủ

từ luồng nhập luồng

từ _thread nhập ngắt_main


nhập khẩu sys

Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.

Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.

Chủ đề mới bắt đầu, chặn trong ba giây. Sau đó, nó gửi một sigint đến luồng chính và chấm dứt.
 


Chủ đề chính nhận được tín hiệu Sigint làm tăng bàn phím

Bàn phím được xử lý bằng cách báo cáo một tin nhắn và thoát khỏi luồng chính, lần lượt chấm dứt chương trình.

Điều này cho thấy làm thế nào một luồng mới có thể làm gián đoạn luồng chính và cách chủ đề chính có thể mong đợi và xử lý sự gián đoạn với mẫu thử nghiệm thử.

Chủ đề chính đang chờ ...

Làm gián đoạn chủ đề chính ngay bây giờ

Chính bị gián đoạn! Thoát ra.

Tiếp theo, hãy để Lôi nhìn vào cách chủ đề chính có thể xử lý sự gián đoạn bằng cách sử dụng trình xử lý tín hiệu.handle_sigint() function below implements this.

Khóa học luồng python miễn phí

Tải xuống bảng gian lận API luồng của tôi và như một phần thưởng, bạn sẽ có quyền truy cập miễn phí vào khóa học email 7 ngày của tôi.handle_sigint(signalnum,frame):

Khám phá cách sử dụng mô -đun luồng Python bao gồm cách tạo và khởi động các luồng mới và cách sử dụng khóa và semaphores mutex# terminate

& nbsp; & nbsp; & nbsp; & nbsp;# chờ xung quanhprint('Main interrupted! Exiting.')

    sys.exit()sys.exit()

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;signal.signal() function.

.....

# Đăng ký trình xử lý tín hiệu cho quá trình này

signal(SIGINT,handle_sigint)(SIGINT,handle_sigint)

Và đó là nó.

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.

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

27

28

29

30

31

32

# SuperfastPython.com

# Ví dụ về việc gián đoạn luồng chính và tay cầm bằng trình xử lý tín hiệu

từ thời gian nhập vào giấc ngủtime import sleep

từ luồng nhập luồngthreading import Thread

từ _thread nhập ngắt_main_thread import interrupt_main

từ tín hiệu nhập tín hiệusignal import signal

từ Sigint nhập tín hiệusignal import SIGINT

nhập khẩu syssys

# Xử lý đơn

DEF Tay cầm_Sigint (SignalNum, Frame):handle_sigint(signalnum,frame):

& nbsp; & nbsp; & nbsp; & nbsp;# chấm dứt# terminate

& nbsp; & nbsp; & nbsp; & nbsp; in ('bị gián đoạn chính! thoát.')print('Main interrupted! Exiting.')

    sys.exit()sys.exit()

# Nhiệm vụ được thực thi trong một luồng mới

nhiệm vụ def ():task():

& nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment

    sleep(3)sleep(3)

& nbsp; & nbsp; & nbsp; & nbsp;# ngắt luồng chính# interrupt the main thread

& nbsp; & nbsp; & nbsp; & nbsp; in ('làm gián đoạn chủ đề chính ngay')print('Interrupting main thread now')

    interrupt_main()interrupt_main()

# Đăng ký trình xử lý tín hiệu cho quá trình này

signal(SIGINT,handle_sigint)(SIGINT,handle_sigint)

# Bắt đầu chủ đề mới

thread=Thread(target=task)=Thread(target=task)

thread.start().start()

# Đợi xung quanh

whileTrue:True:

& nbsp; & nbsp; & nbsp; & nbsp; print ('Chủ đề chính chờ ...')print('Main thread waiting...')

    sleep(0.5)sleep(0.5)

Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.

Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.

Chủ đề mới bắt đầu, chặn trong ba giây. Sau đó, nó gửi một sigint đến luồng chính và chấm dứt.

Chủ đề chính nhận được tín hiệu sigint được xử lý bởi chức năng xử lý tín hiệu tùy chỉnh của chúng tôi. Hàm trả lời bằng cách báo cáo một tin nhắn và thoát khỏi luồng chính, lần lượt chấm dứt chương trình.

Điều này cho thấy làm thế nào một luồng mới có thể làm gián đoạn luồng chính và cách luồng chính có thể mong đợi và xử lý sự gián đoạn với trình xử lý tín hiệu đã đăng ký.

Chủ đề chính đang chờ ...

Chủ đề chính đang chờ ...

Chủ đề chính đang chờ ...

Chủ đề chính đang chờ ...

Chủ đề chính đang chờ ...

Chủ đề chính đang chờ ...

Làm gián đoạn chủ đề chính ngay bây giờ

Chính bị gián đoạn! Thoát ra.

Tiếp theo, hãy để Lôi nhìn vào một ví dụ trong đó sự gián đoạn vào luồng chính bị trì hoãn.

Ví dụ về sự gián đoạn bị trì hoãn của chủ đề chính

Chúng ta có thể khám phá làm thế nào một sự gián đoạn của luồng chính có thể bị trì hoãn.

Điều này có thể xảy ra nếu luồng chính bị chặn, chẳng hạn như trong một cuộc gọi để ngủ, bằng cách thực hiện một cuộc gọi IO chặn hoặc bằng cách chờ đợi một nguyên thủy đồng thời.

Trong ví dụ này, chúng tôi sẽ có khối luồng chính trong một thời gian dài bằng cách gọi hàm ngủ. Chủ đề chính sẽ bị gián đoạn ở giữa giấc ngủ này, nhưng sẽ không phản hồi cho đến khi cuộc gọi chặn kết thúc.

Điều này có thể đạt được bằng cách cập nhật ví dụ đầu tiên ở trên xử lý sự gián đoạn bằng cách sử dụng khối Excet Try-Except.

Chúng ta có thể cập nhật luồng chính để thay vì lặp lại mãi mãi và ngủ trong một phần nhỏ, thay vào đó, không có vòng lặp và một cuộc gọi nào đến hàm thời gian.slege () trong bảy giây.time.sleep() function for seven seconds.

.....

# Xử lý bị gián đoạn

try::

& nbsp; & nbsp; & nbsp; & nbsp;# khối trong một thời gian dài# block for a long time

& nbsp; & nbsp; & nbsp; & nbsp; print ('Chủ đề chính chờ ...')print('Main thread waiting...')

    sleep(7)sleep(7)

Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.KeyboardInterrupt:

Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.# terminate main thread

& nbsp; & nbsp; & nbsp; & nbsp; in ('bị gián đoạn chính! thoát.')print('Main interrupted! Exiting.')

    sys.exit()sys.exit()

# Nhiệm vụ được thực thi trong một luồng mới

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.

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

27

# SuperfastPython.com

nhiệm vụ def ():

từ thời gian nhập vào giấc ngủtime import sleep

từ luồng nhập luồngthreading import Thread

từ _thread nhập ngắt_main_thread import interrupt_main

nhập khẩu syssys

# Nhiệm vụ được thực thi trong một luồng mới

nhiệm vụ def ():task():

& nbsp; & nbsp; & nbsp; & nbsp;# block trong giây lát# block for a moment

    sleep(3)sleep(3)

& nbsp; & nbsp; & nbsp; & nbsp;# ngắt luồng chính# interrupt the main thread

& nbsp; & nbsp; & nbsp; & nbsp; in ('làm gián đoạn chủ đề chính ngay')print('Interrupting main thread now')

    interrupt_main()interrupt_main()

# Bắt đầu chủ đề mới

thread=Thread(target=task)=Thread(target=task)

thread.start().start()

# Xử lý bị gián đoạn

try::

& nbsp; & nbsp; & nbsp; & nbsp;# khối trong một thời gian dài# block for a long time

& nbsp; & nbsp; & nbsp; & nbsp; print ('Chủ đề chính chờ ...')print('Main thread waiting...')

    sleep(7)sleep(7)

Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.KeyboardInterrupt:

Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.# terminate main thread

& nbsp; & nbsp; & nbsp; & nbsp; in ('bị gián đoạn chính! thoát.')print('Main interrupted! Exiting.')

    sys.exit()sys.exit()

Chạy ví dụ đầu tiên tạo và bắt đầu luồng mới.

Chủ đề chính sau đó các vòng lặp, chặn trong nửa giây một lần và báo cáo một tin nhắn mỗi lần lặp.

Chủ đề mới bắt đầu, chặn trong ba giây. Sau đó, nó gửi một sigint đến luồng chính và chấm dứt.

Chủ đề chính nhận được tín hiệu sigint được xử lý bởi chức năng xử lý tín hiệu tùy chỉnh của chúng tôi. Hàm trả lời bằng cách báo cáo một tin nhắn và thoát khỏi luồng chính, lần lượt chấm dứt chương trình.sleep() function returns.

Điều này cho thấy làm thế nào một luồng mới có thể làm gián đoạn luồng chính và cách luồng chính có thể mong đợi và xử lý sự gián đoạn với trình xử lý tín hiệu đã đăng ký.KeyboardInterrupt The KeyboardInterrupt is handled by reporting a message and exiting the main thread, which in turn terminates the program.

Điều này cho thấy làm thế nào một luồng mới có thể làm gián đoạn luồng chính và cách luồng chính sẽ không phản hồi ngay lập tức nếu nó bị chiếm bởi một cuộc gọi chức năng chặn.

Chủ đề chính đang chờ ...

Làm gián đoạn chủ đề chính ngay bây giờ

Chính bị gián đoạn!Thoát ra.

Đọc thêm

Phần này cung cấp các tài nguyên bổ sung mà bạn có thể thấy hữu ích.

API

  • Chủ đề - song song dựa trên luồng

Hướng dẫn

  • Python Threading: Hướng dẫn hoàn chỉnh

Sách

  • Bảng xác định API mô -đun chủ đề
  • Chủ đề câu hỏi phỏng vấn API
  • Python Threading Jump-Start, Jason Brownlee, 2022 (Sách của tôi!). & NBSP;my book!). 

Takeaways

Bây giờ bạn đã biết làm thế nào để làm gián đoạn chủ đề chính trong Python.

Bạn có câu hỏi nào không? Đặt câu hỏi của bạn trong các ý kiến dưới đây và tôi sẽ cố gắng hết sức để trả lời.
Ask your questions in the comments below and I will do my best to answer.

Ảnh của Kirk Thornton trên unplash