|
45 | 45 | def new_task(self, task):
|
46 | 46 | '''
|
47 | 47 | Admit a newly started task to the scheduler
|
48 |
| -
|
49 | 48 | '''
|
50 | 49 | self._task_queue.append(task)
|
51 | 50 |
|
|
89 | 88 | ...
|
90 | 89 |
|
91 | 90 | 到此为止,我们实际上已经实现了一个“操作系统”的最小核心部分。
|
92 |
| -生成器函数就是认为,而yield语句是任务挂起的信号。 |
| 91 | +生成器函数就是任务,而yield语句是任务挂起的信号。 |
93 | 92 | 调度器循环检查任务列表直到没有任务要执行为止。
|
94 | 93 |
|
95 | 94 | 实际上,你可能想要使用生成器来实现简单的并发。
|
|
103 | 102 |
|
104 | 103 | class ActorScheduler:
|
105 | 104 | def __init__(self):
|
106 |
| - self._actors = { } # Mapping of names to actors |
| 105 | + self._actors = {} # Mapping of names to actors |
107 | 106 | self._msg_queue = deque() # Message queue
|
108 | 107 |
|
109 | 108 | def new_actor(self, name, actor):
|
|
148 | 147 | # Send to the printer task
|
149 | 148 | sched.send('printer', n)
|
150 | 149 | # Send the next count to the counter task (recursive)
|
151 |
| -
|
152 | 150 | sched.send('counter', n-1)
|
153 | 151 |
|
154 | 152 | sched = ActorScheduler()
|
|
175 | 173 | class YieldEvent:
|
176 | 174 | def handle_yield(self, sched, task):
|
177 | 175 | pass
|
| 176 | + |
178 | 177 | def handle_resume(self, sched, task):
|
179 | 178 | pass
|
180 | 179 |
|
|
201 | 200 | '''
|
202 | 201 | Add a newly started task to the scheduler
|
203 | 202 | '''
|
204 |
| -
|
205 | 203 | self._ready.append((task, None))
|
206 | 204 | self._numtasks += 1
|
207 | 205 |
|
|
253 | 251 | def __init__(self, sock, data):
|
254 | 252 | self.sock = sock
|
255 | 253 | self.data = data
|
| 254 | + |
256 | 255 | def handle_yield(self, sched, task):
|
257 |
| -
|
258 | 256 | sched._write_wait(self.sock.fileno(), self, task)
|
| 257 | + |
259 | 258 | def handle_resume(self, sched, task):
|
260 | 259 | nsent = self.sock.send(self.data)
|
261 | 260 | sched.add_ready(task, nsent)
|
262 | 261 |
|
263 | 262 | class AcceptSocket(YieldEvent):
|
264 | 263 | def __init__(self, sock):
|
265 | 264 | self.sock = sock
|
| 265 | + |
266 | 266 | def handle_yield(self, sched, task):
|
267 | 267 | sched._read_wait(self.sock.fileno(), self, task)
|
| 268 | + |
268 | 269 | def handle_resume(self, sched, task):
|
269 | 270 | r = self.sock.accept()
|
270 | 271 | sched.add_ready(task, r)
|
|
273 | 274 | class Socket(object):
|
274 | 275 | def __init__(self, sock):
|
275 | 276 | self._sock = sock
|
| 277 | + |
276 | 278 | def recv(self, maxbytes):
|
277 | 279 | return ReadSocket(self._sock, maxbytes)
|
| 280 | + |
278 | 281 | def send(self, data):
|
279 | 282 | return WriteSocket(self._sock, data)
|
| 283 | + |
280 | 284 | def accept(self):
|
281 | 285 | return AcceptSocket(self._sock)
|
| 286 | + |
282 | 287 | def __getattr__(self, name):
|
283 | 288 | return getattr(self._sock, name)
|
284 | 289 |
|
|
0 commit comments