#!/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()。