からの非同期IOコルーチン生成量

まず、yieldとyieldフォームの違いを見てみましょう。コードは次のとおりで、範囲(10)に渡されます。

def g1(iterable):
    yield iterable

def g2(iterable):
    yield from iterable

for value in g1(range(10)):
    print(value)

for value in g2(range(10)):
    print(value)

結果:出力範囲(10)を生成し、出力からの反復データを生成します。

range(0, 10)
0
1
2
3
4
5
6
7
8
9

収量を学習する前に、まずライブラリを認識します:チェーン、このライブラリは、リスト、dictなどを含む任意の数のデータを反復できます。

from itertools import chain 

my_list = [1,2,3]

my_dict = {
    "bobby":"http://project.com",
    "bobby2":"http://www.immoc.com"

}
for value in chain(my_dict,my_list,range(5,10)):
    print(value)

実装する関数はこんな感じで、その中のデータを1つずつ繰り返します

bobby
bobby2
1
2
3
5
6
7
8
9

今私たちは自分たちでチェーンを実装します

# 自定义一个chain
def my_chain(*args,**kwargs):
    for my_iterable in args:
        for value in my_iterable:
            yield value

for value in my_chain(my_dict,my_list,range(5,10)):
    print(value)

結果の値も

bobby
bobby2
1
2
3
5
6
7
8
9

今、からの収量でそれを実現

def my_chain(*args,**kwargs):
    for my_iterable in args:
        yield from my_iterable  # yield from可以迭代其中的所有数据
for value in my_chain(my_dict,my_list,range(5,10)):
    print(value)

 生成される結果は次のとおりです。からの生成は上記のコードを簡略化します。実際、からの生成はすべてのデータを反復するだけでなく、内部で多くの例外処理を実装します。

bobby
bobby2
1
2
3
5
6
7
8
9

 そして、yield fromの使用方法を使用して、呼び出し元とサブジェネレータの間に双方向チャネルを確立し、接続を実現します

def g1(gen):
    yield from gen

def main():
    g = g1()
    g.send(None)

# main 调用方 g1(委托生成器),gen子生成器
# yield from 会在调用方和子生成器之间建立一个双向通道

これは実際の戦闘からの降伏の例です。 


final_result = {}


def sales_sum(pro_name):
    total = 0
    nums = []
    while True:
        x = yield
        print(pro_name+"销量:",x)
        if not x:
            break
        total+=x
        nums.append(x)
    return total,nums



def middle(key):
    while 1:
        final_result[key] = yield from sales_sum(key)
        print(key+"销量统计完成!")



def main():
    data_set = {
        "bobby牌面膜":[1200,1500,3000],
        "bobby牌手机":[1600,1700,13000,1200],
        "bobby牌大衣":[2300,2100,10,60]
    }
    for key,data_set in data_set.items():
        print("start key",key)
        m = middle(key)
        m.send(None) # 预激活middle协程
        for value in data_set:
            m.send(value) # 给协程传递每一组的值
        m.send(None)
    print("final_result",final_result)

"""
# 详细剖析
"""
def sales_sum1(pro_name):
    total = 0
    nums = []
    while True:
        x = yield
        print(pro_name+"销量:",x)
        if not x:
            break
        total+=x
        nums.append(x)
    return total,nums



if __name__ == '__main__':
    my_gen  =sales_sum1("boobby牌手机")
    my_gen.send(None)
    my_gen.send(1000)
    my_gen.send(1300)
    my_gen.send(1200)
    try:
        my_gen.send(None)# 会异常,把返回值显示出来
    except StopIteration as e:# 需要处理异常
        result = e.value
        print(result)  # yield from会实现这些功能处理异常并返回值

 最終的な効果は次のようになります。上記のコードをコピーし、分析してIEDで実行できます。これには、上からのyieldの使用が含まれます。呼び出し元、デリゲートジェネレーター、サブジェネレーター、およびサブジェネレーターは、呼び出し元との双方向チャネルを実装します。

boobby牌手机销量: 1000
boobby牌手机销量: 1300
boobby牌手机销量: 1200
boobby牌手机销量: None
(3500, [1000, 1300, 1200])

 

公開された89元の記事 ウォンの賞賛2 ビュー2803

おすすめ

転載: blog.csdn.net/qq_37463791/article/details/105481936