【问题标题】:python win32api blocking bottle routespython win32api 阻塞瓶子路由
【发布时间】:2013-05-12 08:38:33
【问题描述】:

我有一个瓶子网络应用程序。在某些时候,我希望服务器启动一个对话窗口来向服务器管理员询问一些事情。这个警报,即使是从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

【问题讨论】:

    标签: python winapi bottle


    【解决方案1】:

    您可能将 Gevent 与您的瓶子应用程序一起使用。如果你使用 monkey.patch_all(),你的线程会变成串行的,并且会阻塞瓶执行。

    你不应该修补你的线程:

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

    【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2011-02-10
    • 2015-10-25
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2015-08-08
    相关资源
    最近更新 更多