[英]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.