'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+PauseCtrl+ScrLk 来终止 Python 当 Ctrl+C 不起作用时处理。

如果代码 运行 test_func() 在主线程上调用睡眠,则按 Ctrl+C 会引发 KeyboardInterrupt 异常。

def main():
    test_func()
    # thread0 = threading.Thread(target=test_func)
    # thread0.daemon = True
    # thread0.start()