OLD | NEW |
| (Empty) |
1 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
2 # See LICENSE for details. | |
3 | |
4 # | |
5 # Author: Clark Evans (cce@clarkevans.com) | |
6 # | |
7 | |
8 """ | |
9 flow -- asynchronous data flows using generators | |
10 | |
11 This module provides a mechanism for using async data flows through the use of | |
12 generators. The basic idea of flow is that when ever you require data from a | |
13 producer, you yield the producer. If the producer is ready, then you can call | |
14 producer.next() to fetch the incoming data. Otherwise, the underlying | |
15 controller will suspend the operation to try again later. | |
16 | |
17 For example, here is a simple 'printer' which consumes items from its source by | |
18 printing them. Note that to get a new item, it first yields the data source | |
19 and then calls source.next():: | |
20 | |
21 from __future__ import generators | |
22 from twisted.flow import flow | |
23 from twisted.internet import reactor, defer | |
24 | |
25 def printer(source): | |
26 source = flow.wrap(source) | |
27 while True: | |
28 yield source | |
29 print source.next() | |
30 | |
31 someFlowSource = [\"one\", flow.Cooperate(1), \"two\"] | |
32 | |
33 d = flow.Deferred(printer(someFlowSource)) | |
34 d.addCallback(lambda _: reactor.stop()) | |
35 reactor.run() | |
36 | |
37 In the example above, there are three objects imported from the flow module:: | |
38 | |
39 - flow.wrap converts many data sources such as lists, generators, and | |
40 deferreds, into a special instruction object, a Stage. In this case, a | |
41 simple list is wrapped. | |
42 | |
43 - flow.Deferred is a flow Controller which executes the stage passed to it, | |
44 aggregating all results into a list which is passed to the deferred's | |
45 callback. In this case, the result list is empty, but the callback is | |
46 used to stop the reactor after the printing has finished. | |
47 | |
48 - flow.Cooperate is a special instruction object which is used by the flow | |
49 Controller. In this case, the the flow pauses for one second between \"one
\" | |
50 and \"two\". | |
51 | |
52 | |
53 Most classes in the flow module an Instruction, either a CallLater or a Stage. | |
54 A Stage instruction is used to wrap various sorts of producers, anything from a | |
55 simple string to Callback functions. Some stages can be constructed directly, | |
56 such as Zip, Concurrent, Merge, Callback, or Threaded. But in most cases, in | |
57 particular _String, _List, _Iterable, and _Deferred, state construction is | |
58 handled through the wrap function. Stages can yield other stages to build a | |
59 processing chain, results which are returned to the previous stage, or a | |
60 CallLater instruction which causes the whole operation to be suspended. | |
61 | |
62 | |
63 Typically, the CallLater instructions as passed up the call stack till the top | |
64 level, or Controller. The controller then typically returns control, but | |
65 registers itself to be called later. Once called again, the controller sets up | |
66 the call stack and resumes the top level generator. There is a special | |
67 CallLater, Cooperate, which simply resumes the chain of stages at a later time. | |
68 Some stages, Callback, _Deferred, and Threaded have their own special CallLater | |
69 which handles the process of resuming flow for their specific case. | |
70 | |
71 The inheritence hierarchy defined here looks like this:: | |
72 | |
73 Instruction | |
74 CallLater | |
75 Cooperate | |
76 Stage | |
77 # private stages (use flow.wrap) | |
78 _String | |
79 _List | |
80 _Iterable | |
81 _Deferred | |
82 # public stages | |
83 Map | |
84 Zip | |
85 Concurrent | |
86 Merge | |
87 Block | |
88 Callback* | |
89 Threaded* | |
90 Controller | |
91 Deferred | |
92 Block | |
93 Protocol | |
94 | |
95 """ | |
96 | |
97 from twisted.flow.base import * | |
98 from twisted.flow.stage import * | |
99 from twisted.flow.pipe import * | |
100 from twisted.flow.wrap import wrap | |
101 from twisted.flow.controller import Deferred, Block | |
102 from twisted.flow.protocol import makeProtocol, Protocol | |
OLD | NEW |