我有一种情况,我得到要处理的作业列表,例如要从互联网抓取的网页列表)。每个作业都是独立的,并且这些作业可以按任意顺序处理。个别作业可能失败或成功,并且可能必须相应地进行处理(例如,失败的抓取任务的临时数据可能必须删除,并且< em>在下一轮抓到)
我正在尝试使用python中基于线程的处理来实现它。为了模拟实际的任务,可以说我有大量的整数数组,而每个人的工作就是计算每个数组的Sum
或Product
。我想做的是使用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 的必要操作,而不是等到合并 请告知我如何添加上述功能,并且如果其中一个仅能满足爬行页面之类的情况,请提供建议。也欢迎其他任何建议。
答案 0 :(得分:0)
您可以通过两种方式中的任何一种在代码中添加两种功能-
getProgress
和getStatus
方法(优雅的方法)您可以创建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