有个global的dict叫result,开了100个thread往这个dict里添加数据,另外还有一个线程每隔10秒执行一下json.dumps(result),偶尔会出现这个错误。
data=base64.b64encode(zlib.compress(json.dumps(result)))
File "/usr/lib/python2.6/json/__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
chunks = list(self.iterencode(o))
File "/usr/lib/python2.6/json/encoder.py", line 309, in _iterencode
for chunk in self._iterencode_dict(o, markers):
File "/usr/lib/python2.6/json/encoder.py", line 247, in _iterencode_dict
for key, value in items:
RuntimeError: dictionary changed size during iteration
目测是因为在json.dumps的同时其他线程写入导致的。
但是在多线程的function里用了lock还是一样的问题:
lock.acquire()
result[xx]=xxx
lock.release()
在json.dumps的地方单独加锁也是一样的问题。
但是如果在写入的地方和dumps的地方都加锁,经常会导致死锁……
data=base64.b64encode(zlib.compress(json.dumps(result)))
File "/usr/lib/python2.6/json/__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
chunks = list(self.iterencode(o))
File "/usr/lib/python2.6/json/encoder.py", line 309, in _iterencode
for chunk in self._iterencode_dict(o, markers):
File "/usr/lib/python2.6/json/encoder.py", line 247, in _iterencode_dict
for key, value in items:
RuntimeError: dictionary changed size during iteration
目测是因为在json.dumps的同时其他线程写入导致的。
但是在多线程的function里用了lock还是一样的问题:
lock.acquire()
result[xx]=xxx
lock.release()
在json.dumps的地方单独加锁也是一样的问题。
但是如果在写入的地方和dumps的地方都加锁,经常会导致死锁……