6
A
回答
6
這裏是一個basic example of a coroutine:
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
cr.next()
return cr
return start
@coroutine
def grep(pattern):
print "Looking for %s" % pattern
while True:
line = (yield)
if pattern in line:
print(line)
g = grep("python")
# Notice how you don't need a next() call here
g.send("Yeah, but no, but yeah, but no")
g.send("A series of tubes")
g.send("python generators rock!")
# Looking for python
# python generators rock!
我們可以把含有這種協同程序類,和代表呼籲其send
方法到協程:
class Foo(object):
def __init__(self,pattern):
self.count=1
self.pattern=pattern
self.grep=self._grep()
@coroutine
def _grep(self):
while True:
line = (yield)
if self.pattern in line:
print(self.count, line)
self.count+=1
def send(self,arg):
self.grep.send(arg)
foo = Foo("python")
foo.send("Yeah, but no, but yeah, but no")
foo.send("A series of tubes")
foo.send("python generators rock!")
foo.pattern='spam'
foo.send("Some cheese?")
foo.send("More spam?")
# (1, 'python generators rock!')
# (2, 'More spam?')
注意foo
行爲像一個協程(只要它有一個發送方法),但是是一個類 - 它可以有可以與協程交互的屬性和方法。
欲瞭解更多信息(和精彩實例),見大衛Beazley的Curious Course on Coroutines and Concurrency.
+0
我讀過比茲利的「好奇的課程」,並試圖實施一些我在那裏學到的東西,當我問這個問題時。感謝您展示def send(),我不確定這是否是採取的方法。 – 2010-12-14 06:33:15
相關問題
- 1. 蟒蛇 - 3.x的支持
- 2. 類型錯誤:不支持的操作類型蟒蛇的web2py
- 3. 3.2 OpenCV的支持CUDA蟒蛇
- 4. 不支持的操作:不寫蟒蛇
- 5. 支點蟒蛇
- 6. 蟒蛇類型錯誤:對象不支持索引
- 7. 蟒蛇 - 一類
- 8. 蟒蛇-payflowpro點播支付
- 9. 的NodeJS或相對URL支持蟒蛇代理的lib
- 10. 蟒蛇在蟒蛇
- 11. 蟒蛇回報類
- 12. 蟒蛇 - 同一類
- 13. 範圍類蟒蛇
- 14. 蟒蛇類型bencode.py
- 15. 導入類蟒蛇
- 16. 定義類蟒蛇
- 17. 類蟒蛇錯誤
- 18. '海峽' 對象不支持的項目分配(蟒蛇)
- 19. 別樣不受支持的操作問題(蟒蛇3)
- 20. 爲什麼我會收到不支持的操作類型錯誤蟒蛇
- 21. 蟒類型錯誤:不支持索引
- 22. 蟒蛇類型的錯誤
- 23. 蟒蛇類型的文件
- 24. 蟒蛇中的分類
- 25. 蟒蛇原始套接字:協議不支持
- 26. 蟒蛇2.7:從CMD蟒蛇
- 27. 更新蟒蛇3.5蟒蛇
- 28. 無法在蟒蛇蟒蛇
- 29. 爲蟒蛇defaultdict
- 30. 蟒蛇類型的字典的聯盟,同時保持值
它沒有內置的Python像'__iter__'。 – 2010-12-13 22:01:06
生成器和協程是Python中相同類型的對象。 – katrielalex 2010-12-13 22:23:02