π 7 ΠΠ΅Π³ΠΊΠΈΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ Python ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
exit()
. ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π²ΡΡ
ΠΎΠ΄ΠΈΡ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠ°. ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°:
ΠΠ΅ΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ
ΠΠ°ΠΊ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ Python
ΠΠΎΡΠΎΠΊΠΈ (ΠΈΠ»ΠΈ threads) Π² Python ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π·Π°Π΄Π°Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. Π ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π·Π°ΠΏΡΡΠΊ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΠΈΡΡΠ°ΡΠΈΠ΅ΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ²Π½ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΌΠΎΡΡ Π²Π°ΠΌ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ Π² Python.
1. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π°Π³ΠΎΠ² Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ - ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π°Π³ΠΈ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ»Π°Π³, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ Π² ΡΠΈΠΊΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎΠ³Π΄Π° ΡΠ»Π°Π³ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡΡΠ΅Π΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΡ, ΠΏΠΎΡΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ Π²ΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ· ΡΠΈΠΊΠ»Π°.
import threading
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ»Π°Π³ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°
stop_flag = threading.Event()
def worker():
while not stop_flag.is_set():
# ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΡΠΎΠΊΠ°
pass
print("ΠΠΎΡΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½")
# ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΠΎΡΠΎΠΊ
thread = threading.Thread(target=worker)
thread.start()
# ΠΠΎΠ·ΠΆΠ΅ Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ Π² Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ True
stop_flag.set()
2. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°
ΠΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ - ΡΡΠΎ Π²ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. ΠΠ½ΡΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ try/except Π±Π»ΠΎΠΊ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΊ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΠ» ΡΠ²ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.
import threading
class CustomException(Exception):
pass
def worker():
try:
while True:
# ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΡΠΎΠΊΠ°
pass
except CustomException:
print("ΠΠΎΡΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½")
# ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΠΎΡΠΎΠΊ
thread = threading.Thread(target=worker)
thread.start()
# ΠΠΎΠ·ΠΆΠ΅ Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ, Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
raise CustomException()
3. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° terminate ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ ctypes
ΠΡΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π½Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ terminate ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ ctypes. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΠΎΠΈΡ Π±ΡΡΡ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΡΠΌ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠΌΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ»ΠΈ ΠΎΡΡΠ°Π²ΠΈΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° ΠΈΠ»ΠΈ ΡΠ΅ΡΡΡΡΠΎΠ².
import ctypes
import threading
import time
def worker():
while True:
# ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΡΠΎΠΊΠ°
pass
# ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΠΎΡΠΎΠΊ
thread = threading.Thread(target=worker)
thread.start()
# ΠΠΎΠ·ΠΆΠ΅ Π² ΠΊΠΎΠ΄Π΅, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠΎΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄ terminate ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ ctypes
if thread.is_alive():
ctypes.pythonapi.PyThreadState_SetAsyncExc(
ctypes.c_long(thread.ident), ctypes.py_object(SystemExit)
)
thread.join()
print("ΠΠΎΡΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½")
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ° Π² Python. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΠΈ ΡΡΠ΅Π±ΡΠ΅Ρ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΡΠ΅ΡΠ΅ΠΊ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π°ΡΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΈ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Π°Ρ ΠΏΠΎΡΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ.