我有一个 Bottle 网络应用程序。在某些时候,我希望服务器弹出一个对话框窗口来向服务器管理员询问一些事情。即使从 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 应用程序中的类似代码时,直到在对话框上单击"is"或“否”为止,服务器都不会响应其路由。相反,它等待对话框返回一个值,这意味着对话框在某种程度上阻塞执行。
有人知道如何在不干扰 Bottle 工作的情况下提出对话吗?我已经没有主意了。感谢您投入的时间和精力。
更新:
这不是问题。 Bottle 确实在这个示例中运行,没有受到干扰。实际问题在这里有更好的描述:bottle gevent and threading: gevent is only usable from a single thread
最佳答案
您可能将 Gevent 与您的 Bottle 应用程序一起使用。如果您使用monkey.patch_all(),您的线程将变为串行,并且将阻止 Bottle 执行。
你不应该修补你的线程:
from gevent import monkey
monkey.patch_all(thread=False)
关于python win32api阻塞 Bottle 路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16505586/