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

标签 python multithreading

一个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/appendleftpop/popleft 以外的操作 对象的性能不如在 list 实例上的好;即使像 __getitem__ 这样简单的事情也是 O(n)

关于python - 取消线程中的任务执行并从队列中删除任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26789442/

相关文章:

c++ - 如何使用 `std::async` 在互斥保护循环中调用函数?

wpf - WPF:UI线程被阻止时更新鼠标指针

multithreading - 为什么 AutoResetEvent 和 ManualResetEvent 不支持构造函数中的名称?

python - 线程已完成的进程永远不会退出

python - 无法在 Opencv2 上导入 cv

python - Numpy:多维数组的真值比较

python - 是否可以通过 Python 进行 HTML 抓取和数据挖掘?

python - Python 中位串的逻辑或

python - 为什么 Liza Daly 的 fast_iter 使用 while 循环而不是 if 语句?

c++ - 来自不同线程的同步输出流