簡體   English   中英

python threading.Event:添加事件參數

[英]python threading.Event: add event params

我是否可以使用來自線程模塊的Event對象,不僅可以通知某些事件已發生,還可以提供此事件的一些參數,例如:

e = Event()
...
e.param = "this is event data"
e.set()

另一個線程:

e.wait()
data = e.param

乍一看似乎沒問題,但有什么問題可以發生嗎? 安全嗎? 如果沒有,還有什么方法可以更好地在線程之間傳遞一些事件參數?

感謝名單。

您實際上不需要將值附加到Event對象,您可以使用與Event分開的其他全局,屬性等,並使用Event來表示它已更新。 這是通常的做事方式。

但是你正在做的事情真的沒有 除了使用信號事件的常規競爭問題之外,它不會增加任何其他問題。 然而,它似乎有點誤導 - 它使得看起來好像param以某種方式同步,當它不是時。

如果您嘗試發信號通知新值已准備就緒,並同步對該值的訪問,則幾乎總是需要Condition ,如下所示:

c = Condition()
data = None
...

with c:
    data = "new data"
    c.notify()

...

with c:
    while data is None:
        c.wait()

或者,更簡單地說,只是使用queue而不是首先共享變量:

q = Queue()

...

q.put(data)

... 

data = q.get()

這種方法的一個潛在問題是,如果事件被快速設置,則在等待線程讀取舊值之前可以覆蓋該參數。

這種線程間消息傳遞的更標准方法是使用Queue.Queue 但是,基於隊列的解決方案的限制是只有一個線程可以讀取消息。 換句話說:讀者消費該消息。 這種方法非常適合生產者 - 消費者范例。 (你沒有提到你是否有多個線程在等待事件)。

對於多個讀者線程,您還應該考慮使用pubsub (發布者/訂閱者)解決方案,盡管我不知道python中任何開箱即用的pubsub實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM