我有一个瓶子Web应用程序。在某个时候,我希望服务器引发一个对话框,要求服务器管理员提供某些信息。即使从Thread启动,此警报也会阻止-而且我真的不明白为什么。

要查看此ctypes MessageBox是否被阻止,我尝试在一个最小的示例上在线程上运行它。我试过这个例子:

import threading
from threading import Thread
import ctypes
import time
MessageBox = ctypes.windll.user32.MessageBoxA

def alert():
    userChoice = MessageBox(0, "And this is crazy", "Hey I just met you",4)
    threading.Timer(3.0,alert).start()

worker = Thread(target=alert)
worker.setDaemon(False)
worker.start()

while (True):
    print("main thread is printing")
    time.sleep(2)


在此,主线程每隔2秒继续打印一次。同时,每3秒显示一次从线程启动的警报方法。我们清楚地看到,循环并没有等待对话框返回值。

尽管进行了此测试,但是当尝试从Bottle应用程序尝试类似的代码时,直到在对话框上单击“是”或“否”,服务器才不会响应其路由。相反,它等待对话框返回一个值,这意味着对话框在某种程度上阻止了执行。

有谁知道如何在不影响瓶装工作的情况下发起对话?我的想法不多了。感谢您的时间和精力。


更新:
这不是问题。瓶子确实在没有干扰的情况下运行此示例。实际问题在此处进行了更好的描述:bottle gevent and threading: gevent is only usable from a single thread

最佳答案

您可能将Gevent与Bottle应用程序一起使用。如果您选择monkey.patch_all(),则您的线程将变为串行线程,并会阻止执行瓶。

您不应该修补线程:

from gevent import monkey
monkey.patch_all(thread=False)

关于python - python win32api阻塞瓶路线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16505586/

10-10 19:43