簡體   English   中英

協程vs Python中的類

[英]coroutines vs classes in python

我的問題很廣泛。 當可以使用對象時,為什么要使用協程? 我可以輕松地實現一個在next()下僅工作一次的迭代器,然后您必須調用o.send(x)。 除了通過OOP可以實現的狀態持久化之外,協程還需要做更多的事情嗎? 他們更輕嗎? 只是語法糖嗎? 實際上,我可以對生成器與迭代器問相同的問題,但是我想我已經讀到生成器只是語法糖。

如果確實如此,協程為何如此重要? 我確定我對他們有所遺漏,但我不知道是什么。

是的,從技術上講,協程是語法糖,但不是瑣碎的糖。 任何協程都可以在不使用yieldsend等的情況下手動進行重寫。但是,這種轉換可能很痛苦。 考慮(從此處改編):

def print_name(prefix):
  print("Searching prefix: {}".format(prefix))
  while True:
    firstName = (yield)
    lastName = (yield)
    if prefix in firstName or prefix in lastName:
      print("{} {}".format(firstName, lastName))

可以將其重寫為:

class NamePrinter(object):
  def __init__(self, prefix):
    self.prefix = prefix
    self.gotFirstName = False

  def send(self, data):
    if not self.gotFirstName:
      self.firstName = data
      self.gotFirstName = True
    else:
      self.lastName = data
      if self.prefix in self.firstName or self.prefix in self.lastName:
        print(name)
      self.gotFirstName = False

這可行。 但是即使有了這個微型示例,當不使用協程時,我們也必須編寫更多內容。 在更復雜的有狀態協程中,程序員將必須手動跟蹤當前狀態,哪些變量在當前狀態中有意義等。

Python中的協程(以及類似的現代JavaScript以及未來的C ++中的async / await )會自動將線性代碼轉換為具有良好控制的輸入,易於處理的錯誤等的狀態機。

協程是向應用程序添加異步動作的一種方式。 對象只是應用程序中保存信息或工作的事物。 因此,兩者一起用於創建異步應用程序。

https://www.geeksforgeeks.org/coroutine-in-python/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM