python win32api阻塞 Bottle 路线

标签 python winapi bottle

我有一个 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/

相关文章:

winapi - Windows SDK 许可证

python sqlite auto increment 仍然要求插入时的 id 字段

python - 向量化 numpy 数组扩展

python - 值错误 : I/O operation on closed file to_excel pandas

python - 如何使用Django REST框架读写Elasticsearch?

python - Flask:TypeError:参数 '%s'的预期Ptr <cv::UMat>

c++ - 如何确定 Win32 事件的信号状态?

c++ - 隐形主窗口

python - 你如何接受 Python Bottle 服务器中的任何 URL?

python - Bottle python 中的 Rebase 模板函数不会按应有的方式呈现模板