
1 oott123 Mar 19, 2014 via Android 写的时候拷贝一份出来,不知道可行么 |
2 9hills Mar 19, 2014 via iPad 1 写入加锁,其实如果能保证各个线程key基本不一样的话,可以不加锁 2 读的时候可以用 result.copy() copy出来到temp result 然后dump |
4 a2z OP @9hills 用copy的话可能会导致数据不同步,因为dump之后会清空原有的result,所以就怕copy之后旧的result里写入了新数据,然后被清空,部分新数据就丢失了。 |
5 henghost Mar 19, 2014 还是请高手支招吧 拷贝一份的话,应该也很麻烦哟 |
7 a2z OP @est 其实是这样的,100个thread采集数据,存到result这个dict里面 有另外一个thread每隔30秒把result dict 转换成json然后发送出去。转换完之后就可以清空result dict让新的数据进来了。 发送数据的thread里面是while true,然后json.dumps 发送数据然后sleep 30秒。现在还有个问题就是thread一多这个发送数据的thread就会卡,经常sleep超过30秒…… |
8 9hills Mar 19, 2014 @a2z 你主题中可没有描述dump出来清空result。。。 要想真正的线程安全,你的逻辑应该这样 100个thread把数据写到Queue中,单开一个Thread从Queue中读取数据,写入全局变量RESULT中,写入前请求RESULT_LOCK锁,写入后释放RESULT_LOCK锁 定时dump json的线程,在dump之前请求RESULT_LOCK锁,开始dump,清空dict,完成后释放RESULT_LOCK锁 这样会在你dump的过程中,停止写入,如果发生死锁,这个逻辑肯定是没问题的,你的程序有问题。。 |
9 9hills Mar 19, 2014 注意,用try finally 保证锁一定会释放 |
10 a2z OP debug了半天,原来是python的threading搞的鬼。看了很多stackoverflow的讨论,都建议不要用thread尽量用process,都说thread比单线程都慢…… |
11 zhizhongzhiwai Feb 25, 2016 标准答案: json.dumps(result.copy()) |