acr*_*ige 6 python multithreading
我是否可以使用来自线程模块的Event对象,不仅可以通知某些事件已发生,还可以提供此事件的一些参数,例如:
e = Event()
...
e.param = "this is event data"
e.set()
Run Code Online (Sandbox Code Playgroud)
另一个线程:
e.wait()
data = e.param
Run Code Online (Sandbox Code Playgroud)
乍一看似乎没问题,但有什么问题可以发生吗?安全吗?如果没有,还有什么方法可以更好地在线程之间传递一些事件参数?
感谢名单.
您实际上并不需要将值附加到Event对象,您可以使用与分开的其他一些全局,属性等Event,并使用Event来表示已对其进行更新。这是做事的通常方式。
但是,您所做的确实没有错。除了使用事件进行信号传递所引起的常规竞赛问题外,它不会添加任何其他问题。但是,它似乎确实有误导性-使得它似乎在param某种程度上是同步的,而有时却是不同步的。
如果您试图表示已准备好一个新值,并同步访问该值,则几乎总是需要一个Condition,如下所示:
c = Condition()
data = None
...
with c:
data = "new data"
c.notify()
...
with c:
while data is None:
c.wait()
Run Code Online (Sandbox Code Playgroud)
或者,更简单地说,只使用a queue而不首先共享变量:
q = Queue()
...
q.put(data)
...
data = q.get()
Run Code Online (Sandbox Code Playgroud)