Date Tags stream

异步入流

  1. 异步函数执行的结果不像同步函数一样可以直接赋值给一个变量,异步编程核心思想在于安排(一般体现在回掉函数)
  2. deva的流支持异步函数的运行,运行结果将进入流,可以很方便的在流上编写处理逻辑(提前安排好流的处理逻辑)
In [1]:
from deva import *

#将log流中的每个数据都*2后报警
log.map(lambda x:x*2)>>warn
In [2]:
#支持async异步

import asyncio

async def foo():
    time.time()>>print
    await asyncio.sleep(2)
    time.time()>>print
    return range<<10>>sample
    
foo() | log
Out[2]:
<coroutine object foo at 0x1159607c0>
In [10]:
#支持tornado coroutine异步

@gen.coroutine
def t_foo():
    yield gen.sleep(2)
    return range << 10 >> sample >> first
In [11]:
t_foo()|log
Out[11]:
<Future pending cb=[coroutine.<locals>.wrapper.<locals>.<lambda>() at /usr/local/lib/python3.8/site-packages/tornado/gen.py:251, IOLoop.add_future.<locals>.<lambda>() at /usr/local/lib/python3.8/site-packages/tornado/ioloop.py:688]>
WARNING:root:0
2020-12-03 13:56:45.398915 : 0

状态函数

  1. deva实现了简单的两个状态函数,计数器和累加器。
  2. 计数器和累加器都支持初始化值
In [5]:
# 计数器支持日志流log和start初始值两个参数
c = Counter(log)
In [6]:
123>>c
345>>c
WARNING:root:2
WARNING:root:4
2020-12-03 13:56:13.997556 : 1
2020-12-03 13:56:14.002683 : 2
Out[6]:
2
In [7]:
s1 = Summer()
In [8]:
123>>s1
Out[8]:
123
In [9]:
345>>s1
Out[9]:
468

异步http

  1. deva实现了异步http流,进入http流的url都会发起异步请求,并且将请求结果返回下游
  2. deva实现异步和同步好几种http函数
In [12]:
# 异步流http(),类似flatten能把list和generator转化成单个节点,http()可以把url变成response
s = Stream()
s.http().map(lambda r:r.html.absolute_links|len)>>log
'http://baidu.com'>>s
Out[12]:
'http://baidu.com'
WARNING:root:82
2020-12-03 13:59:46.270716 : 41
In [13]:
# httpx,异步请求函数,这里请求后将结果放入s1这个流中处理,提取页面包含链接的总数并且报警
s1=Stream()
s1.map(lambda r:r.html.absolute_links|len)>>warn
httpx('http://www.baidu.com')|s1
Out[13]:
<Future pending cb=[coroutine.<locals>.wrapper.<locals>.<lambda>() at /usr/local/lib/python3.8/site-packages/tornado/gen.py:251, IOLoop.add_future.<locals>.<lambda>() at /usr/local/lib/python3.8/site-packages/tornado/ioloop.py:688]>
WARNING:root:41
In [14]:
# 同步函数http.get
http.get('http://www.baidu.com').html.absolute_links|len
Out[14]:
41

异步的并发速度要远大于同步,这个其实不是最大优点,异步的核心在于安排式书写,写起来和人类安排任务一样的逻辑