欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 中由 yield 實現(xiàn)異步操作

 更新時間:2020年05月04日 11:11:40   作者:silverze  
這篇文章主要介紹了Python 中由 yield 實現(xiàn)異步操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

yield在python中初學時,覺得比較難理解。yield的作用:

①返回一個值、②接收調(diào)用者的參數(shù)

分析下面的代碼:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

def consumer():
  r = ''
  while True:
    n = yield r
    print("[Consumer] n = %d" %n)
    if not n:
      return
    print("[Consumer] consuming %s..." %n)
    r = '200 OK'

def produce(c):
  c.send(None)
  h = 0
  while h < 5:
    h = h + 1
    print("[Producer] producing %d..." %h)
    s = c.send(h)
    print("[Producer] consumer return: %s" %s)
  c.close()

c = consumer() #創(chuàng)建一個生成器
produce(c) #在該函數(shù)中,調(diào)用生成器的send()方法

結(jié)合程序運行過程,可分析出:

第一步:

在produce(c)函數(shù)中,調(diào)用了c.send(None)啟動了生成器,遇到y(tǒng)ield暫停;接著執(zhí)行produce()中接下來的代碼,從運行結(jié)果看,確實打印出了[Produce] producing 1 … 當程序運行至c.send(h)時,調(diào)用生成器并且通過yield傳遞了參數(shù)(h = 1)進入consumer()函數(shù)執(zhí)行。

第二步:

yield傳遞參數(shù)(h=1)給consumer()函數(shù)中的n,并接著上一次暫停處往下繼續(xù)執(zhí)行,打印出[Consumer] n = 1,[Consumer] consuming 1… ;在consumer()函數(shù)中此時 r 被賦值為'200 OK',接著循環(huán)遇到y(tǒng)ield, consumer()函數(shù)又暫停并且返回變量 r 的值,此時程序又進入produce(c)函數(shù)中接著執(zhí)行。

第三步:

produce(c)函數(shù)接著第一步中c.send(h)處,繼續(xù)往下執(zhí)行打印出[Producer] consumer return: 200 OK,并進行循環(huán),打印[Producer] producing 2… 后,又調(diào)用c.send(h) 。。。如此循環(huán)回到第一步!

補充知識:python asyncio模型 事件循環(huán)

異步建立在事件循環(huán)上.

簡單來說事件循環(huán):

1.把要執(zhí)行的函數(shù)放入隊列

2.取出函數(shù),執(zhí)行

3.看看還要不要繼續(xù)放入此函數(shù)

4.繼續(xù)第一步

一個簡單的例子說明:

"""
  1.yield 掛起當前函數(shù).
  2.使用調(diào)度器循環(huán)
  3.使用next喚醒此函數(shù)繼續(xù)執(zhí)行
"""
def f1():
  for i in range(3):
    print('f1 %d'%i)
    yield
def f2():
  for i in range(5):
    print('f2 %d' %i)
    yield
def f3():
  for i in range(10):
    print('f3 %d'%i)
    yield
#模擬一個調(diào)度器
task_q = collections.deque((f1(),f2(),f3()))
#讓調(diào)度器調(diào)度這些生成器們
while task_q:
  task = task_q.popleft() #彈出首個生成器
  try:
    next(task)     #執(zhí)行,如果沒有異常證明此生成器還沒執(zhí)行完成,可以繼續(xù)放入隊列中
    task_q.append(task) #執(zhí)行完成后,把任務(wù)繼續(xù)添加到隊列中.
    time.sleep(0.5)
  except StopIteration as ex:
    pass

以上這篇Python 中由 yield 實現(xiàn)異步操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python搭建Gitee圖床的示例代碼

    Python搭建Gitee圖床的示例代碼

    在寫博客的過程中經(jīng)常要插入圖片,本文將使用Python實現(xiàn)對上傳的圖片自動壓縮,自動編碼,以及自動推送到遠程倉庫,感興趣的可以了解一下
    2021-10-10
  • Python讀取xlsx數(shù)據(jù)生成圖標代碼實例

    Python讀取xlsx數(shù)據(jù)生成圖標代碼實例

    這篇文章主要介紹了Python讀取xlsx數(shù)據(jù)生成圖標代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • 解決在keras中使用model.save()函數(shù)保存模型失敗的問題

    解決在keras中使用model.save()函數(shù)保存模型失敗的問題

    這篇文章主要介紹了解決在keras中使用model.save()函數(shù)保存模型失敗的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python學習之os包使用教程詳解

    Python學習之os包使用教程詳解

    本文將詳細介紹python的內(nèi)置包——OS?包。OS?包擁有著普遍的操作系統(tǒng)功能,擁有著各種各樣的函數(shù)來操作系統(tǒng)的驅(qū)動功能。快來跟隨小編一起學習一下OS包的使用方法吧
    2022-03-03
  • django實現(xiàn)同一個ip十分鐘內(nèi)只能注冊一次的實例

    django實現(xiàn)同一個ip十分鐘內(nèi)只能注冊一次的實例

    下面小編就為大家?guī)硪黄猟jango實現(xiàn)同一個ip十分鐘內(nèi)只能注冊一次的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 通過python實現(xiàn)Google的精準搜索功能

    通過python實現(xiàn)Google的精準搜索功能

    這篇文章主要介紹了通過python實現(xiàn)Google的精準搜索功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-05-05
  • python?Socket無限發(fā)送接收數(shù)據(jù)方式

    python?Socket無限發(fā)送接收數(shù)據(jù)方式

    這篇文章主要介紹了python?Socket無限發(fā)送接收數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 使用python進行量化交易的完整指南

    使用python進行量化交易的完整指南

    量化交易,作為現(xiàn)代金融市場中的一種先進交易方式,通過運用數(shù)學模型、統(tǒng)計方法和計算機算法來指導交易決策,旨在提高交易效率和決策的準確性,本文將詳細介紹如何使用Python進行量化交易,包括策略開發(fā)、數(shù)據(jù)處理、回測、風險管理和實盤交易等關(guān)鍵步驟
    2024-09-09
  • 基于python實現(xiàn)百度翻譯功能

    基于python實現(xiàn)百度翻譯功能

    這篇文章主要介紹了基于python實現(xiàn)百度翻譯功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Kears 使用:通過回調(diào)函數(shù)保存最佳準確率下的模型操作

    Kears 使用:通過回調(diào)函數(shù)保存最佳準確率下的模型操作

    這篇文章主要介紹了Kears 使用:通過回調(diào)函數(shù)保存最佳準確率下的模型操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評論