<p>我认为问题是因为你有一个<code>ThreadedServer</code>,它当然是多线程的。在</p>
<p>但是,<a href="https://stackoverflow.com/questions/2227169/are-python-built-in-containers-thread-safe">Python ^{<cd2>} are not threadsafe</a>(不允许多个线程同时访问它们),因此无论何时访问集合,都需要实现一个<a href="http://docs.python.org/2/library/threading.html#lock-objects" rel="nofollow noreferrer">lock</a>。您可以将锁与Python上下文管理器(即<a href="http://docs.python.org/2/reference/compound_stmts.html#with" rel="nofollow noreferrer">^{<cd3>} statement</a>)一起使用,该管理器为您处理获取/释放锁的操作,<code>Lock</code>本身一次只能由一个上下文管理器获取,从而阻止对集合的同时访问。请参见下面的修改代码:</p>
<pre><code>import rpyc
import threading
test = ['hi']
myReferences= set()
myReferencesLock = threading.Lock()
class MyService(rpyc.Service):
def on_connect(self):
"""Think o+ this as a constructor of the class, but with
a new name so not to 'overload' the parent's init"""
self.fn = None
def exposed_setCallback(self,fn):
# i = 0
self.fn = fn # Saves the remote function for calling later
print self.fn
with myReferencesLock:
myReferences.add(self.fn)
#abc.append(i)
#i+=1
with myReferencesLock:
print myReferences
for x in myReferences:
print x
#print abc
if __name__ == "__main__":
# lists are pass by reference, so the same 'test'
# will be available to all threads
# While not required, think about locking!
from rpyc.utils.server import ThreadedServer
t = ThreadedServer(MyService, port = 18888)
t.start()
</code></pre>
<p>欢迎来到线程编程的世界。确保线程之间的共享锁保护数据!在</p>