从作业处理器启动线程时,如何跟踪作业线程的进度?

时间:2019-03-16 02:46:41

标签: python multithreading python-multithreading

我有一种情况,我得到要处理的作业列表,例如要从互联网抓取的网页列表)。每个作业都是独立的,并且这些作业可以按任意顺序处理。个别作业可能失败成功,并且可能必须相应地进行处理(例如,失败的抓取任务的临时数据可能必须删除,并且< em>在下一轮抓到

我正在尝试使用python中基于线程的处理来实现它。为了模拟实际的任务,可以说我有大量的整数数组,而每个人的工作就是计算每个数组的SumProduct。我想做的是使用JobsProcessor类对象实例化JobWorker类对象的线程,这些线程通过为其他类(Sum和{{1} } 这里)。相同的代码如下所述。显示了一个片段

Product

我想在此过程中添加2个功能。

  • 合并:当所有作业线程完成时,我想知道所有from queue import Queue, Empty from threading import Thread import time class Product: def __init__(self,data): self.data = data def doOperation(self): try: product =self.data[0] for d in self.data[1:]: if d>100000: raise Exception( "Forcefully throwing exception") product*=d time.sleep(1) return product except: return "product computation failed" class Sum: def __init__(self,data): self.data = data def doOperation(self): try: sum =0 for d in self.data: sum+=d time.sleep(1) return sum except: return "sum computation failed" class JobWorker(Thread): def __init__(self, queue): Thread.__init__(self) self.queue = queue def run(self): while True: try: jobitem = self.queue.get_nowait() if jobitem is None: break jobdata, optype = jobitem if optype =='sum': opobj = Sum(jobdata) jobresult = opobj.doOperation() elif optype =='product': opobj = Product(jobdata) jobresult = opobj.doOperation() else: print ("Invalid op type") jobresult = 'Failed' print(" job result", jobresult) self.queue.task_done() except Empty: break except: print ("Some exception occured") #How to pass it to up to the main jobs processor# class JobsProcessor(object): def __init__(self, joblist): self.joblist = joblist self.job_queue = Queue() def process_resources(self): try: for job in self.joblist: self.job_queue.put(job) for i in range(2): jobthread = JobWorker(self.job_queue) jobthread.start() ''' Write code here to monitor current status for all running jobs ''' self.job_queue.join() '''I want to write code here to track progress status for all jobs Some jobs may have failed, not completed and based on that I may want to take further action such as retry or flag them''' print("Finished Jobs") except: pass orgjobList = [ ([1,5,9,4],'sum'), ([5,4,5,8],'product'), ([100,45,678,999],'product'), ([3743,34,44324,543],'sum'), ([100001, 100002, 9876, 83989], 'product')] mainprocessor = JobsProcessor(orgjobList) mainprocessor.process_resources() 对象的状态(例如,它们是否成功完成/失败完成)。 失败/异常可能发生在 JobWorker 对象中,甚至可能是 Sum Product 对象。失败/成功状态应传播回 JobsProcessor ,在这里我要根据返回的状态执行其他操作,例如重新处理/删除/ send_elsewhere等
  • 监视-我还想拥有一种JobWorker功能,该功能可以连续检查当前正在运行/已完成的作业的状态并执行诸如 delete 的必要操作,而不是等到合并

请告知我如何添加上述功能,并且如果其中一个仅能满足爬行页面之类的情况,请提供建议。也欢迎其他任何建议。

1 个答案:

答案 0 :(得分:0)

您可以通过两种方式中的任何一种在代码中添加两种功能-

  • 使用全局变量(最简单的方法)
  • 在您的类中使用getProgressgetStatus方法(优雅的方法)

您可以创建2个线程,一个线程完成实际工作并更新progress变量。

对于第二种方法,您可以在__init__类中设置两个var,如下所示。

def __init__(self):
    self.progress = 0
    self.success = True
    self.isDone = False
    self.error = "No Error Occurred"

然后,您可以在代码中包含如下所示的逻辑-

def actualWork(self):
    self.isDone = 0
    try:
        for i in range(1000):
            self.progress = i
            time.sleep(0.01)
        self.isDone = True
    except Exception as e:
        self.success = False
        self.error = str(e)

def getProgress(self):
    return self.progress

def getError(self):
    return self.error