通过上一节实现了简单的 线程安全队列后本节我们继续实现线程池中的任务对象,任务对象包括同步和异步任务对象,通过任务对象可实现我们自己的业务逻辑方法。
一、基本任务对象
传入被调用的方法和参数,通过uuid生成唯一的任务id。
class Task(object):
def __init__(self, func, *args, **kwargs):
"""
基本任务对象初始化
:param func:
:param args:
:param kwargs:
"""
self.id = uuid.uuid4()
self.callable = func
self.args = args
self.kwargs = kwargs
def __str__(self):
return 'Task id: %s' % str(self.id)
二、异步任务对象
继承自基本任务对象,除此之外还包括读、写任务处理结果的方法,当无数据时会阻塞读线程,数据写入时通过条件变量通知被阻塞的线程结束等待操作。
class AsyncTask(Task):
def __init__(self, func, *args, **kwargs):
"""
异步任务对象初始化
:param callable:
"""
super(AsyncTask, self).__init__(func, *args, **kwargs)
self.result = None
self.condition = threading.Condition()
def set_result(self, result):
"""
设置返回结果
:param result:
:return:
"""
# 加锁 通知被阻塞线程
self.condition.acquire()
self.result = result
self.condition.notify()
self.condition.release()
def get_result(self):
"""
获取返回结果 结果不存在时会阻塞当前线程
:return:
"""
# 加锁 等待任务处理结果写入
self.condition.acquire()
if not self.result:
self.condition.wait()
result = self.result
self.condition.release()
return result