我有一个瓶子网络应用程序。在某些时候,我希望服务器提出一个对话窗口,询问服务器管理员的东西。即使从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 gevent and threading: gevent is only usable from a single thread
答案 0 :(得分:1)
你可能会在你的瓶子应用中使用Gevent。如果你使用monkey.patch_all(),你的线程将变为串行,并将阻止执行瓶子。
你不应修补你的线程:
from gevent import monkey
monkey.patch_all(thread=False)