基础知识六、Python实现线程池之任务对象


       通过上一节实现了简单的 线程安全队列后本节我们继续实现线程池中的任务对象,任务对象包括同步和异步任务对象,通过任务对象可实现我们自己的业务逻辑方法。

一、基本任务对象

       传入被调用的方法和参数,通过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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值