You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

42 lines
1.2 KiB

4 years ago
  1. """
  2. Scheduler queues
  3. """
  4. import marshal
  5. from six.moves import cPickle as pickle
  6. from queuelib import queue
  7. def _serializable_queue(queue_class, serialize, deserialize):
  8. class SerializableQueue(queue_class):
  9. def push(self, obj):
  10. s = serialize(obj)
  11. super(SerializableQueue, self).push(s)
  12. def pop(self):
  13. s = super(SerializableQueue, self).pop()
  14. if s:
  15. return deserialize(s)
  16. return SerializableQueue
  17. def _pickle_serialize(obj):
  18. try:
  19. return pickle.dumps(obj, protocol=2)
  20. # Python>=3.5 raises AttributeError here while
  21. # Python<=3.4 raises pickle.PicklingError
  22. except (pickle.PicklingError, AttributeError) as e:
  23. raise ValueError(str(e))
  24. PickleFifoDiskQueue = _serializable_queue(queue.FifoDiskQueue, \
  25. _pickle_serialize, pickle.loads)
  26. PickleLifoDiskQueue = _serializable_queue(queue.LifoDiskQueue, \
  27. _pickle_serialize, pickle.loads)
  28. MarshalFifoDiskQueue = _serializable_queue(queue.FifoDiskQueue, \
  29. marshal.dumps, marshal.loads)
  30. MarshalLifoDiskQueue = _serializable_queue(queue.LifoDiskQueue, \
  31. marshal.dumps, marshal.loads)
  32. FifoMemoryQueue = queue.FifoMemoryQueue
  33. LifoMemoryQueue = queue.LifoMemoryQueue