调度器维护一个task元组的队列,根据特定的调度策略选择task执行,执行的
结果将被投入该队列。IO task在满足触发条件的时候被调度,一种典型的IO
task:
def recvsegment(s, length):
rcv = s.recv(10000000)
if len(rcv) == length:
return rcv
return lambda:rcv + recvsegment(s, length-len(rcv))
我们在每次调度的时候,会检查与一个IO task联系的标识符(文件描述符)是
否准备好,如果准备好,就执行该IO task.对于task元组中参数被求值完毕
(所有的tail都为一个值)的情况,我们会以这些参数为入参,执行head。在
这种设计下,任何IO操作应该和主控制流分离,以(head, io1,io2…)的方
式进行。
事实上,task的执行载体可以是原生线程,这样,就实现了M:N的并发模型,
对于特殊的情况(IO完成却没有机会被调度倒的task),还可以动态增减线程
进行处理。
在特定的假设下,这套多任务方案有一定的意义。这个假设就是:1.IO占据了
控制流的大部分时间。2.任何一种非IO操作都可以很快完成。因此,在特殊
的时机交出控制权,而不是抢占调度,是可以接受的。事实上,现实世界有
很多系统满足这样的要求。