我有一段python代码来练习python协同例程。 正如A. Jesse Jiryu Davis所述。
如果我在协同例程中放入两个连续的socket.recv()方法,我收到错误消息: '第二个 chunk = s.recv(1000)行中无法立即完成非阻塞套接字操作。
经过几天搜索和阅读python文档,我仍然不知道为什么会这样。我必须错过一些'python Gotchas',是吗?
我正在使用python 3.6进行测试。代码如下,我删除了所有不相关的代码,使下面的代码精确且与主题相关:
#! /usr/bin/python
import socket
import select
import time
selectors_read = []
selectors_write = []
class Task:
def __init__(self, gen):
self.gen = gen
self.step()
def step(self):
try:
next(self.gen)
except StopIteration:
return
def get():
s = socket.socket()
selectors_write.append(s.fileno())
s.setblocking(False)
try:
s.connect(('www.baidu.com', 80))
except:
pass
yield
selectors_write.remove(s.fileno())
print('[CO-ROUTINE] ', 'Send')
selectors_read.append(s.fileno())
s.send('GET /index.html HTTP/1.0\r\n\r\n'.encode())
yield
while True:
chunk = s.recv(1000)
chunk = s.recv(1000)
if chunk:
print('[CO-ROUTINE] received')
else:
selectors_read.remove(s.fileno())
break
# yield
task_temp = Task(get())
while True:
for filenums in select.select(selectors_read, selectors_write, []):
for fd in filenums:
task_temp.step()