python 异步协程的使用

目标

消费流(kafka或者queue)的数据,使用python协程异步处理这些数据,提高python的并发性

理解协程异步

协程理解起来很简单,但是用起来费劲,结合实际的项目,下面给出一个简单的协程实力

这里使用yield生成协程的生成器

import datetime
import random
import time
from multiprocessing import Queue

import asyncio


class worker(object):
    def __init__(self, stream=None):
        self.coro_work = None
        self.stream = stream

    def run(self):
        self.coro_work = self.worker()
        next(self.coro_work)
        self.feeder()

    def worker(self):
        while True:
            data = yield
            if data:
                sleep_time = random.random() / 100
                self.do_worker(data, sleep_time)
            else:
                print(datetime.datetime.now(), 'worker get None then stop.')

    def feeder(self):
        while True:
            if self.stream.qsize() == 0:
                self.close()
                break
            else:
                data = self.stream.get(block=True, timeout=1)
            print(datetime.datetime.now(), 'do worker on {:5d}'.format(data))
            self.coro_work.send(data)

    def do_worker(self, data, sleep_time):
        # 这里asyncio.sleep仅仅为了模拟需要协程处理的场景,用sleep没法触发协程处理
        asyncio.sleep(sleep_time)
        print(datetime.datetime.now(), 'do worker on {:5d} sleep {:.6f}'.format(data, sleep_time))

    def close(self):
        self.stream.close()
        self.coro_work.close()


if __name__ == '__main__':
    # sleep_time = random.random()
    # print(sleep_time)

    stream = Queue(maxsize=1000)
    for i in range(0, 1000):
        stream.put(i)
    kk = stream.get(block=True, timeout=1)
    print(kk)
    #
    # time.sleep(1)
    work_begin = time.time()
    worker(stream).run()
    work_finish = time.time()
    print('time cost:', work_finish - work_begin)

对比 yield fromasyncio

yield from 的场景

asyncio 的场景

参考链接

  1. 刘江的博客教程-协程与异步IO
  2. Go 协程实现原理和使用示例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值