一个Python应用程序,我正在开发一个文件夹的监视并将某些新的或更改的文件上传到服务器。作为任务队列,我使用 Queue模块和工作线程池。
有时在上传过程中文件会发生变化,需要取消上传并重新开始。
我知道如何使用 threading.Event 停止线程执行,但是如何删除或移动队列中的任务?
最佳答案
最简单的方法是将已加载到队列
中的实例标记为已取消:
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.
如果您获取用于同步访问Queue<的内部互斥体,也可以直接与
:Queue
内部使用的deque
进行交互
>>> 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 版本。另外,请记住 deque< 上除
对象的性能不如在 append
/appendleft
和 pop
/popleft
以外的操作list
实例上的好;即使像 __getitem__
这样简单的事情也是 O(n)
。
关于python - 取消线程中的任务执行并从队列中删除任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789442/