<p>实际的共享部分与“如何与另一个对象共享一个值?”如果没有线程,所有相同的解决方案都可以工作。你知道吗</p>
<p>例如。您已经在将<code>foo</code>实例传递给<code>bar</code>初始值设定项,因此只需从那里获取它:</p>
<pre><code>class bar(threading.Thread):
def __init__(self,fooInstance):
threading.Thread.__init__(self,name="bar")
self.var1 = fooInstance.var1
</code></pre>
<hr/>
<p>但是这个线安全吗?你知道吗</p>
<p>嗯,是的,但只是因为你从来没有真正开始后台线程。但我假设在实际代码中,两个线程同时运行,都访问<code>var1</code>值。在这种情况下,没有某种同步就不能保证线程安全。例如:</p>
<pre><code>class foo(threading.Thread):
def __init__(self):
threading.Thread.__init__(self,name="foo=>bar")
self.var1 = {}
self.var1lock = threading.Lock()
class bar(threading.Thread):
def __init__(self,fooInstance):
threading.Thread.__init__(self,name="bar")
self.var1 = fooInstance.var1
self.var1lock = fooInstance.var1lock
</code></pre>
<p>现在,不是这样:</p>
<pre><code>self.var1[name] = value
</code></pre>
<p>…您可以这样做:</p>
<pre><code>with self.var1lock:
self.var1[name] = value
</code></pre>
<p>同样地,与此相反:</p>
<pre><code>val = myOtherfunction(fooInstance.var1[arg]) //other function
</code></pre>
<p>…您可以这样做:</p>
<pre><code>with self.var1lock:
var1arg = var1[arg]
val = myOtherfunction(var1arg)
</code></pre>
<p>或者…事实证明,在CPython中,更新dict中单个键的值(只有内置的<code>dict</code>,而不是子类或自定义映射类!)一直都是原子的,而且可能永远都是。如果你想依靠这个事实,你可以。但只有当锁被证明是一个重要的性能问题时,我才会这么做。我也会评论它的每一个用法,让它更清楚。你知道吗</p>
<hr/>
<p>如果您希望<em>传递</em>值而不是<em>共享</em>值,通常的答案是<a href="https://docs.python.org/3/library/queue.html" rel="nofollow noreferrer">^{<cd5>}</a>或它的一个亲戚。你知道吗</p>
<p>但这需要重新设计你的程序。例如,您可能希望通过队列传递每个新的/更改的键值对。会是这样的:</p>
<pre><code>class foo(threading.Thread):
def __init__(self):
threading.Thread.__init__(self,name="foo=>bar")
self.var1 = {}
self.q = queue.Queue()
def run(self):
b = bar(self)
b.start()
while True:
value, name = getvalue() // name is an string
self.var1[name] = value
self.q.put((name, value))
class bar(threading.Thread):
def __init__(self,fooInstance):
threading.Thread.__init__(self,name="bar")
self.var1 = copy.deepcopy(fooInstance.var1)
self.q = fooInstance.q
def _checkq(self):
while True:
try:
key, val = self.q.get_nowait()
except queue.Empty:
break
else:
self.var1[key] = val
def run(self):
while True:
self._checkq()
arg = myfunction() // somefunction (not shown for simplicity)
val = myOtherfunction(fooInstance.var1[arg]) //other function
print(val)
</code></pre>