取消线程中的任务执行并从队列中删除任务

时间:2014-11-06 21:10:00

标签: python multithreading

Python应用程序我正在为文件夹开发监视程序并将某些新的或已更改的文件上载到服务器。作为任务队列,我使用Queue模块和工作线程池。

有时在上传过程中文件会发生变化,上传需要取消并重新开始。

我知道如何使用threading.Event停止执行线程,但如何删除或移动队列中的任务?

1 个答案:

答案 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 / poppopleft / deque以外的操作执行效果不如list 1}}实例;即使像__getitem__这样简单的事情也是O(n)