dns
dns copied to clipboard
pickle, cPicke 都无法序列化gevent.event.Event()
TypeError: cannot serialize 'Hub' object
from gevent import event e = event.Event() type(e) <class 'gevent.event.Event'>
import pickle pickle.dumps(e) Traceback (most recent call last): File "
", line 1, in File "/usr/lib/python2.7/pickle.py", line 1380, in dumps Pickler(file, protocol).dump(obj) File "/usr/lib/python2.7/pickle.py", line 224, in dump self.save(obj) File "/usr/lib/python2.7/pickle.py", line 331, in save self.save_reduce(obj=obj, _rv) File "/usr/lib/python2.7/pickle.py", line 425, in save_reduce save(state) File "/usr/lib/python2.7/pickle.py", line 286, in save f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.7/pickle.py", line 655, in save_dict self._batch_setitems(obj.iteritems()) File "/usr/lib/python2.7/pickle.py", line 669, in _batch_setitems save(v) File "/usr/lib/python2.7/pickle.py", line 306, in save rv = reduce(self.proto) File "/usr/lib/python2.7/copy_reg.py", line 84, in reduce_ex dict = getstate() TypeError: cannot serialize 'Hub' object *>>> import cPickle as pickle pickle.dumps(e)** Traceback (most recent call last): File " ", line 1, in File "/usr/lib/python2.7/copy_reg.py", line 84, in _reduce_ex dict = getstate() TypeError: cannot serialize 'Hub' object
Now, I have changed a little to fix it.
Make the event variable "e" global variable, and in redis we do need to store the event.
cache=Cache() evt = event.Event()
def handle_response(data): e=cache.get(qname+"e") cache.remove(qname+"e") if e: evt.set() evt.clear()
应该是gevent有修改导致不能序列化了,这个要想想办法,你这种改法的话导致所有请求都是一个event,我那个是一个url一个event,锁的粒度更小一些,这样改会导致速度变慢,需要想想怎么改会好一些