1

ボトル 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 gevent and threading: gevent is only available from a single thread

4

1 に答える 1

1

おそらく、ボトル アプリケーションで Gevent を使用します。monkey.patch_all() を実行すると、スレッドがシリアルになり、ボトルの実行がブロックされます。

スレッドにパッチを当てるべきではありません:

from gevent import monkey
monkey.patch_all(thread=False)
于 2013-05-13T07:26:01.963 に答える