在此简化示例中,杀死工作线程

时间:2019-07-05 00:40:00

标签: python python-3.x multithreading python-multithreading

#!/usr/bin/env python3
from threading import Thread
import queue
import threading
import time

class psqueue:
    worker = None
    q = None

    def __init__(self):
        self.q = queue.Queue()

    def add(self, fn, args):
        self.q.put({
            'fn': fn,
            'args': args
            })

        if not self.worker or not self.worker.isAlive():
            self.worker = Thread(target=self.workerFn, args={})
            self.worker.setDaemon(True)
            self.worker.start()

    def workerFn(self):
        try:
            while self.q.not_empty:
                item = self.q.get(False)
                fn = item['fn']
                args = item['args']

                fn(**args)

                self.q.task_done()
        except queue.Empty:
            pass # queue is empty
        print('worker end')

def waitFn(n):
    print('startwait {}'.format(n))
    time.sleep(5)
    print('endwait {}'.format(n))

q = psqueue()

q.add(waitFn, {'n': 1})
q.add(waitFn, {'n': 2})
q.add(waitFn, {'n': 3})

q.worker.join()

fn(** args)调用将运行许多不同的函数。这些功能包括ssh调用和命令行调用,它们有时可能永远阻塞。在一个完美的世界中,这些功能永远不会永久性地阻塞,但在我这个世界中,这偶尔会发生。

在极端情况下函数调用已完全锁定,我该如何终止fn(** args)调用或终止工作线程?队列项陈旧,如果我杀死它,则阻止其运行,然后重新启动工作进程。

我的工作线程正在安全地与其他线程共享变量(例如,以传达陈旧性),因此,如果可能,我要避免使用multiprocessing.Process()。terminate()。

0 个答案:

没有答案