当前位置: 首页 > 面试题库 >

键盘中断与python的多处理池

王涵育
2023-03-14
问题内容

如何使用python的多处理池处理KeyboardInterrupt事件?这是一个简单的示例:

from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()

当运行上面的代码时,KeyboardInterrupt按时会引发^C,但是该过程只是在此时挂起,我必须在外部将其杀死。

我希望能够随时按下^C并导致所有进程正常退出。


问题答案:

这是一个Python错误。等待threading.Condition.wait()中的条件时,从不发送KeyboardInterrupt。复制:

import threading
cond = threading.Condition(threading.Lock())
cond.acquire()
cond.wait(None)
print "done"

直到wait()返回时,才会传递KeyboardInterrupt异常,并且它永远不会返回,因此中断永远不会发生。KeyboardInterrupt几乎可以肯定会中断条件等待。

请注意,如果指定了超时,则不会发生这种情况;cond.wait(1)将立即收到中断。因此,一种解决方法是指定超时。为此,请更换

    results = pool.map(slowly_square, range(40))

    results = pool.map_async(slowly_square, range(40)).get(9999999)

或类似。



 类似资料:
  • 3、键盘中断的处理过程 当用户按键时,键盘接口会得到一个代表该按键的键盘扫描码,同时产生一个中断请求。键盘中断服务程序先从键盘接口取得按键的扫描码,然后根据其扫描码判断用户所按的键并作相应的处理,最后通知中断控制器本次中断结束并实现中断返回。 若用户按下双态键(如:Caps Lock、Num Lock和Scroll Lock等),则在键盘上相应LED指示灯的状态将发生改变; 若用户按下控制键(如:

  • 我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind

  • 如何强制GLFW管理每秒60次以上的键盘回调?也就是说,我希望GLFW的键盘处理速度取决于实际的FPS。这可能吗?

  • 问题内容: 我发现在Python 3.4中,用于多处理/线程的库很少:多处理vs线程与asyncio。 但是我不知道使用哪个,或者是“推荐的”。他们做的是同一件事还是不同?如果是这样,则将哪一个用于什么?我想编写一个在计算机上使用多核的程序。但是我不知道我应该学习哪个图书馆。 问题答案: 它们旨在(略有)不同的目的和/或要求。CPython(典型的主线Python实现)仍然具有全局解释器锁,因此多

  • 问题内容: 我有一个用python + tkinter编写的GUI应用程序。在我的工作流程中,我通常从命令行启动gui,在gui中做一些事情,然后我发现自己导航到其他终端窗口来做一些工作。不可避免地,我想在某个时候关闭GUI,并且出于习惯,我经常只是导航到启动GUI的终端并发送KeyboardInterrupt(Ctrl-c)。但是,直到我在窗口管理器中举起GUI窗口时,才收到此中断。有谁知道为什

  • 7、键盘输入的举例 例8.1 用键盘最多输入10个字符,并存入内存变量Buff中,若按“Enter”键,则表示输入结束。 解: 1、方法1 .MODEL SMALL  CR EQU  0DH ;定义“回车”键的符号名 .DATA  Buff DB  10 DUP(?) .CODE .STARTUP MOV CX, 0AH LEA BX, Buff .REPEAT  MOV AH, 0H  INT