CONTENTS
3
3.3.7 Doing it the Easy Way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
3.3.8 Mapping File Descriptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.4 Deferred Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
3.4.1 Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
3.4.2 Errbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
3.4.3 Handling either synchronous or asynchronous results . . . . . . . . . . . . . . . . . . . . . . 105
3.4.4 DeferredList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
3.4.5 Class Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
3.4.6 See also . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
3.5 Generating Deferreds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
3.5.1 Class overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
3.5.2 What Deferreds don’t do: make your code asynchronous . . . . . . . . . . . . . . . . . . . . 109
3.5.3 Advanced Processing Chain Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
3.5.4 Returning Deferreds from synchronous functions . . . . . . . . . . . . . . . . . . . . . . . . 110
3.5.5 Integrating blocking code with Twisted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
3.5.6 Possible sources of error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.6 Deferreds are beautiful! (A Tutorial) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
3.6.2 A simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
3.6.3 Errbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
3.6.4 addBoth: the deferred version of finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
3.6.5 addCallbacks: decision making based on previous success or failure . . . . . . . . . . . . . . 124
3.6.6 Hints, tips, common mistakes, and miscellaney . . . . . . . . . . . . . . . . . . . . . . . . . 129
3.6.7 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
3.7 Scheduling tasks for the future . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
3.8 Using Threads in Twisted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
3.8.1 Running code in a thread-safe manner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
3.8.2 Running code in threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
3.8.3 Utility Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
3.8.4 Managing the Thread Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
3.9 Choosing a Reactor and GUI Toolkit Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
3.9.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
3.9.2 Reactor Functionality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
3.9.3 General Purpose Reactors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
3.9.4 Platform-Specific Reactors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
3.9.5 GUI Integration Reactors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
3.9.6 Non-Reactor GUI Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
4 High-Level Twisted 139
4.1 The Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.1.1 Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.1.2 twistd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.1.3 tap2deb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
4.1.4 tap2rpm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
4.2 The Twisted Plugin System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
4.2.1 Writing Extensible Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
4.2.2 Extending an Existing Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.2.3 Alternate Plugin Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.2.4 Plugin Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4.2.5 Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4.3 Writing a Twisted Application Plugin for twistd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4.3.1 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.3.2 A note on .tap files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.3.3 Alternatives to TAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.3.4 Creating the plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
4.3.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.4 Components: Interfaces and Adapters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144