我有从不同线程访问的单例。这个单例通过生成器提供数据。生成器应该被访问数据的线程完全消耗。每个访问数据的线程都应该使用一个新的生成器。这是我的代码:
from datetime import datetime
import threading
import time
class MySingletonCls:
def get_data(self, repeat):
self.nr = 0
for x in xrange(repeat):
time.sleep(0.001)
self.nr += 1
yield x
_my_singleton = None
def MySingleton():
global _my_singleton
if _my_singleton == None:
_my_singleton = MySingletonCls()
return _my_singleton
def test_singleton():
def worker():
singleton = MySingleton()
cnt = 0
for x in singleton.get_data(100):
cnt += 1
print singleton.nr, cnt
threads = []
num_worker_threads = 5
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
test_singleton()
我希望每个工人都收到 100 个条目,实际上就是这样。但是访问单例中的计数器给了我非常奇怪的数字。这是我的程序的输出:
457 100
468 100
470 100
471 100
475 100
这里发生了什么?为每个线程生成单例生成器的条目有多少?为什么单例计数器显示这个奇怪的值?我怎样才能使这个线程安全?