Python应用程序我正在为文件夹开发监视程序并将某些新的或已更改的文件上载到服务器。作为任务队列,我使用Queue模块和工作线程池。
有时在上传过程中文件会发生变化,上传需要取消并重新开始。
我知道如何使用threading.Event停止执行线程,但如何删除或移动队列中的任务?
答案 0 :(得分:1)
最简单的方法是将您加载到Queue
的实例标记为已取消:
class Task(object):
def __init__(self, data):
self.cancelled = False
self.data = data
def cancel(self):
self.cancelled = True
q = Queue.Queue()
t = Task("some data to put in the queue")
q.put(t)
# Later
t.cancel()
然后在你的消费线程中:
task = q.get()
if task.cancelled:
# Skip it
else:
# handle it.
如果您获取用于同步访问deque
的内部互斥锁,也可以直接与Queue
内部使用的Queue
进行互动:
>>> import Queue
>>> q = Queue.Queue()
>>> q.put("a")
>>> q.put("b")
>>> q.put("c")
>>> q.put("d")
>>> q.queue[2]
'c'
>>> q.queue[3]
'd'
>>> with q.mutex: # Always acquire the lock first in actual usage
... q.queue[3]
...
'd'
虽然这应该有效,但不建议弄乱Queue
的内部,如果Queue
的实现发生变化,可能会破坏Python版本。另请注意,append
对象上的appendleft
/ pop
和popleft
/ deque
以外的操作执行效果不如list
1}}实例;即使像__getitem__
这样简单的事情也是O(n)
。