'ctrl + c' 不适用于 windows 上的 python 代码
'ctrl + c' doesn't work with this python code on windows
在我的 mac 中,ctrl + c
与此 python 代码配合得很好。因此脚本以 KeyboardInterrupt 异常退出。
但是在 windows 10 中,ctrl + c
根本不起作用。所以脚本永远运行。
我不知道是什么问题。
这是我的代码:
import time
import threading
def fast_scrap():
pass
def slow_scrap_thread(keyword_list: list):
sleep_time = 2
for keyword in keyword_list:
print(keyword)
print("sleep " + str(sleep_time) + "secs")
time.sleep(sleep_time)
def slow_scrap():
rounds = 0
while True:
keyword_list = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p']
keyword_lists = list()
threads = list()
for i in range(len(keyword_list) // 3 + 1):
keyword_lists.append(keyword_list[i * 3:i * 3 + 3])
for keyword_list in keyword_lists:
thread = threading.Thread(target=slow_scrap_thread, args=(keyword_list, ))
# thread.daemon = True
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
print("rounds: " + str(rounds))
time.sleep(3)
rounds += 1
def main():
thread0 = threading.Thread(target=fast_scrap)
# thread0.daemon = True
thread0.start()
thread1 = threading.Thread(target=slow_scrap)
# thread1.daemon = True
thread1.start()
if __name__ == "__main__":
main()
我认为我的代码中的线程有问题,但不确定是什么。
--------------------编辑---------------------
抱歉,这里是更简单的代码:
import time
import threading
def test_func():
rounds = 0
while True:
print("test_func")
print("rounds: " + str(rounds))
time.sleep(3)
rounds += 1
def main():
thread0 = threading.Thread(target=test_func)
# thread0.daemon = True
thread0.start()
if __name__ == "__main__":
main()
我 运行 使用 conda cmd
中的这段代码,python 3.9.7
我以为 'thread in thread' 有问题,但问题似乎只是在线程中。
抱歉,这个问题只出现在我的环境中??
问题可能是当您尝试在其上使用键盘中断时线程处于挂起状态。尝试在生成新线程的地方捕获 KeyboardInterrupt
exception 并在那里加入它们。
这里发生了一些事情。
来自https://docs.python.org/3/library/signal.html#signals-and-threads:
Python signal handlers are always executed in the main Python thread of the main interpreter, even if the signal was received in another thread.
主线程创建一个非守护线程并运行 test_func() 无限循环。然后主线程退出。非守护线程继续打印一条消息,然后休眠 3 秒,依此类推。
由于中断处理程序在主线程上,非守护线程保持运行并且按Ctrl+C没有影响停止执行。
但是,在 Windows 上,您通常可以按 Ctrl+Pause 或 Ctrl+ScrLk 来终止 Python 当 Ctrl+C 不起作用时处理。
如果代码 运行 test_func() 在主线程上调用睡眠,则按 Ctrl+C 会引发 KeyboardInterrupt 异常。
def main():
test_func()
# thread0 = threading.Thread(target=test_func)
# thread0.daemon = True
# thread0.start()
在我的 mac 中,ctrl + c
与此 python 代码配合得很好。因此脚本以 KeyboardInterrupt 异常退出。
但是在 windows 10 中,ctrl + c
根本不起作用。所以脚本永远运行。
我不知道是什么问题。
这是我的代码:
import time
import threading
def fast_scrap():
pass
def slow_scrap_thread(keyword_list: list):
sleep_time = 2
for keyword in keyword_list:
print(keyword)
print("sleep " + str(sleep_time) + "secs")
time.sleep(sleep_time)
def slow_scrap():
rounds = 0
while True:
keyword_list = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p']
keyword_lists = list()
threads = list()
for i in range(len(keyword_list) // 3 + 1):
keyword_lists.append(keyword_list[i * 3:i * 3 + 3])
for keyword_list in keyword_lists:
thread = threading.Thread(target=slow_scrap_thread, args=(keyword_list, ))
# thread.daemon = True
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
print("rounds: " + str(rounds))
time.sleep(3)
rounds += 1
def main():
thread0 = threading.Thread(target=fast_scrap)
# thread0.daemon = True
thread0.start()
thread1 = threading.Thread(target=slow_scrap)
# thread1.daemon = True
thread1.start()
if __name__ == "__main__":
main()
我认为我的代码中的线程有问题,但不确定是什么。
--------------------编辑---------------------
抱歉,这里是更简单的代码:
import time
import threading
def test_func():
rounds = 0
while True:
print("test_func")
print("rounds: " + str(rounds))
time.sleep(3)
rounds += 1
def main():
thread0 = threading.Thread(target=test_func)
# thread0.daemon = True
thread0.start()
if __name__ == "__main__":
main()
我 运行 使用 conda cmd
中的这段代码,python 3.9.7
我以为 'thread in thread' 有问题,但问题似乎只是在线程中。
抱歉,这个问题只出现在我的环境中??
问题可能是当您尝试在其上使用键盘中断时线程处于挂起状态。尝试在生成新线程的地方捕获 KeyboardInterrupt
exception 并在那里加入它们。
这里发生了一些事情。
来自https://docs.python.org/3/library/signal.html#signals-and-threads:
Python signal handlers are always executed in the main Python thread of the main interpreter, even if the signal was received in another thread.
主线程创建一个非守护线程并运行 test_func() 无限循环。然后主线程退出。非守护线程继续打印一条消息,然后休眠 3 秒,依此类推。
由于中断处理程序在主线程上,非守护线程保持运行并且按Ctrl+C没有影响停止执行。
但是,在 Windows 上,您通常可以按 Ctrl+Pause 或 Ctrl+ScrLk 来终止 Python 当 Ctrl+C 不起作用时处理。
如果代码 运行 test_func() 在主线程上调用睡眠,则按 Ctrl+C 会引发 KeyboardInterrupt 异常。
def main():
test_func()
# thread0 = threading.Thread(target=test_func)
# thread0.daemon = True
# thread0.start()