33< head >
44 < meta charset ="utf-8 " />
55 < meta name ="viewport " content ="width=device-width, initial-scale=1.0 " />
6- < title > softioc.asyncio_dispatcher — pythonSoftIOC 4.5.0+4.gd55483d documentation</ title >
6+ < title > softioc.asyncio_dispatcher — pythonSoftIOC 4.5.0+9.ga89d8ae documentation</ title >
77 < link rel ="stylesheet " href ="../../_static/pygments.css " type ="text/css " />
88 < link rel ="stylesheet " href ="../../_static/css/theme.css " type ="text/css " />
99 < link rel ="stylesheet " href ="../../_static/theme_overrides.css " type ="text/css " />
@@ -97,33 +97,62 @@ <h1>Source code for softioc.asyncio_dispatcher</h1><div class="highlight"><pre>
9797< span class ="kn "> import</ span > < span class ="nn "> atexit</ span >
9898
9999< div class ="viewcode-block " id ="AsyncioDispatcher "> < a class ="viewcode-back " href ="../../reference/api.html#softioc.asyncio_dispatcher.AsyncioDispatcher "> [docs]</ a > < span class ="k "> class</ span > < span class ="nc "> AsyncioDispatcher</ span > < span class ="p "> :</ span >
100- < span class ="k "> def</ span > < span class ="fm "> __init__</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ,</ span > < span class ="n "> loop</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span > < span class ="p "> ):</ span >
100+ < span class ="k "> def</ span > < span class ="fm "> __init__</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ,</ span > < span class ="n "> loop</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span > < span class ="p "> , </ span > < span class =" n " > debug </ span > < span class =" o " > = </ span > < span class =" kc " > False </ span > < span class =" p " > ):</ span >
101101 < span class ="sd "> """A dispatcher for `asyncio` based IOCs, suitable to be passed to</ span >
102102< span class ="sd "> `softioc.iocInit`. Means that `on_update` callback functions can be</ span >
103103< span class ="sd "> async.</ span >
104104
105105< span class ="sd "> If a ``loop`` is provided it must already be running. Otherwise a new</ span >
106106< span class ="sd "> Event Loop will be created and run in a dedicated thread.</ span >
107+ < span class ="sd "> ``debug`` is passed through to ``asyncio.run()``.</ span >
108+
109+ < span class ="sd "> For a clean exit, call ``softioc.interactive_ioc(..., call_exit=False)``</ span >
107110< span class ="sd "> """</ span >
108111 < span class ="k "> if</ span > < span class ="n "> loop</ span > < span class ="ow "> is</ span > < span class ="kc "> None</ span > < span class ="p "> :</ span >
112+ < span class ="c1 "> # will wait until worker is executing the new loop</ span >
113+ < span class ="n "> started</ span > < span class ="o "> =</ span > < span class ="n "> threading</ span > < span class ="o "> .</ span > < span class ="n "> Event</ span > < span class ="p "> ()</ span >
109114 < span class ="c1 "> # Make one and run it in a background thread</ span >
110- < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="o "> =</ span > < span class ="n "> asyncio</ span > < span class ="o "> .</ span > < span class ="n "> new_event_loop</ span > < span class ="p "> ()</ span >
111- < span class ="n "> worker</ span > < span class ="o "> =</ span > < span class ="n "> threading</ span > < span class ="o "> .</ span > < span class ="n "> Thread</ span > < span class ="p "> (</ span > < span class ="n "> target</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="o "> .</ span > < span class ="n "> run_forever</ span > < span class ="p "> )</ span >
115+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __worker</ span > < span class ="o "> =</ span > < span class ="n "> threading</ span > < span class ="o "> .</ span > < span class ="n "> Thread</ span > < span class ="p "> (</ span >
116+ < span class ="n "> target</ span > < span class ="o "> =</ span > < span class ="n "> asyncio</ span > < span class ="o "> .</ span > < span class ="n "> run</ span > < span class ="p "> ,</ span >
117+ < span class ="n "> args</ span > < span class ="o "> =</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __inloop</ span > < span class ="p "> (</ span > < span class ="n "> started</ span > < span class ="p "> ),),</ span >
118+ < span class ="n "> kwargs</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="s1 "> 'debug'</ span > < span class ="p "> :</ span > < span class ="n "> debug</ span > < span class ="p "> })</ span >
112119 < span class ="c1 "> # Explicitly manage worker thread as part of interpreter shutdown.</ span >
113120 < span class ="c1 "> # Otherwise threading module will deadlock trying to join()</ span >
114121 < span class ="c1 "> # before our atexit hook runs, while the loop is still running.</ span >
115- < span class ="n "> worker</ span > < span class ="o "> .</ span > < span class ="n "> daemon</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span >
122+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __worker</ span > < span class ="o "> .</ span > < span class ="n "> daemon</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span >
123+
124+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __worker</ span > < span class ="o "> .</ span > < span class ="n "> start</ span > < span class ="p "> ()</ span >
125+ < span class ="n "> started</ span > < span class ="o "> .</ span > < span class ="n "> wait</ span > < span class ="p "> ()</ span >
126+
127+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __atexit</ span > < span class ="o "> =</ span > < span class ="n "> atexit</ span > < span class ="o "> .</ span > < span class ="n "> register</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __shutdown</ span > < span class ="p "> )</ span >
128+
129+ < span class ="k "> assert</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="ow "> is</ span > < span class ="ow "> not</ span > < span class ="kc "> None</ span > < span class ="ow "> and</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="o "> .</ span > < span class ="n "> is_running</ span > < span class ="p "> ()</ span >
116130
117- < span class ="nd "> @atexit</ span > < span class ="o "> .</ span > < span class ="n "> register</ span >
118- < span class ="k "> def</ span > < span class ="nf "> aioJoin</ span > < span class ="p "> (</ span > < span class ="n "> worker</ span > < span class ="o "> =</ span > < span class ="n "> worker</ span > < span class ="p "> ,</ span > < span class ="n "> loop</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="p "> ):</ span >
119- < span class ="n "> loop</ span > < span class ="o "> .</ span > < span class ="n "> call_soon_threadsafe</ span > < span class ="p "> (</ span > < span class ="n "> loop</ span > < span class ="o "> .</ span > < span class ="n "> stop</ span > < span class ="p "> )</ span >
120- < span class ="n "> worker</ span > < span class ="o "> .</ span > < span class ="n "> join</ span > < span class ="p "> ()</ span >
121- < span class ="n "> worker</ span > < span class ="o "> .</ span > < span class ="n "> start</ span > < span class ="p "> ()</ span >
122131 < span class ="k "> elif</ span > < span class ="ow "> not</ span > < span class ="n "> loop</ span > < span class ="o "> .</ span > < span class ="n "> is_running</ span > < span class ="p "> ():</ span >
123132 < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span > < span class ="s2 "> "Provided asyncio event loop is not running"</ span > < span class ="p "> )</ span >
124133 < span class ="k "> else</ span > < span class ="p "> :</ span >
125134 < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="o "> =</ span > < span class ="n "> loop</ span >
126135
136+ < span class ="k "> def</ span > < span class ="nf "> close</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ):</ span >
137+ < span class ="k "> if</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __atexit</ span > < span class ="ow "> is</ span > < span class ="ow "> not</ span > < span class ="kc "> None</ span > < span class ="p "> :</ span >
138+ < span class ="n "> atexit</ span > < span class ="o "> .</ span > < span class ="n "> unregister</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __atexit</ span > < span class ="p "> )</ span >
139+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __atexit</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span >
140+
141+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __shutdown</ span > < span class ="p "> ()</ span >
142+
143+ < span class ="k "> async</ span > < span class ="k "> def</ span > < span class ="nf "> __inloop</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ,</ span > < span class ="n "> started</ span > < span class ="p "> ):</ span >
144+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="o "> =</ span > < span class ="n "> asyncio</ span > < span class ="o "> .</ span > < span class ="n "> get_running_loop</ span > < span class ="p "> ()</ span >
145+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __interrupt</ span > < span class ="o "> =</ span > < span class ="n "> asyncio</ span > < span class ="o "> .</ span > < span class ="n "> Event</ span > < span class ="p "> ()</ span >
146+ < span class ="n "> started</ span > < span class ="o "> .</ span > < span class ="n "> set</ span > < span class ="p "> ()</ span >
147+ < span class ="k "> del</ span > < span class ="n "> started</ span >
148+ < span class ="k "> await</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __interrupt</ span > < span class ="o "> .</ span > < span class ="n "> wait</ span > < span class ="p "> ()</ span >
149+
150+ < span class ="k "> def</ span > < span class ="nf "> __shutdown</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ):</ span >
151+ < span class ="k "> if</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __worker</ span > < span class ="ow "> is</ span > < span class ="ow "> not</ span > < span class ="kc "> None</ span > < span class ="p "> :</ span >
152+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="o "> .</ span > < span class ="n "> call_soon_threadsafe</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __interrupt</ span > < span class ="o "> .</ span > < span class ="n "> set</ span > < span class ="p "> )</ span >
153+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __worker</ span > < span class ="o "> .</ span > < span class ="n "> join</ span > < span class ="p "> ()</ span >
154+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> __worker</ span > < span class ="o "> =</ span > < span class ="kc "> None</ span >
155+
127156 < span class ="k "> def</ span > < span class ="fm "> __call__</ span > < span class ="p "> (</ span >
128157 < span class ="bp "> self</ span > < span class ="p "> ,</ span >
129158 < span class ="n "> func</ span > < span class ="p "> ,</ span >
@@ -139,7 +168,13 @@ <h1>Source code for softioc.asyncio_dispatcher</h1><div class="highlight"><pre>
139168 < span class ="n "> completion</ span > < span class ="p "> (</ span > < span class ="o "> *</ span > < span class ="n "> completion_args</ span > < span class ="p "> )</ span >
140169 < span class ="k "> except</ span > < span class ="ne "> Exception</ span > < span class ="p "> :</ span >
141170 < span class ="n "> logging</ span > < span class ="o "> .</ span > < span class ="n "> exception</ span > < span class ="p "> (</ span > < span class ="s2 "> "Exception when running dispatched callback"</ span > < span class ="p "> )</ span >
142- < span class ="n "> asyncio</ span > < span class ="o "> .</ span > < span class ="n "> run_coroutine_threadsafe</ span > < span class ="p "> (</ span > < span class ="n "> async_wrapper</ span > < span class ="p "> (),</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="p "> )</ span > </ div >
171+ < span class ="n "> asyncio</ span > < span class ="o "> .</ span > < span class ="n "> run_coroutine_threadsafe</ span > < span class ="p "> (</ span > < span class ="n "> async_wrapper</ span > < span class ="p "> (),</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> loop</ span > < span class ="p "> )</ span >
172+
173+ < span class ="k "> def</ span > < span class ="fm "> __enter__</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ):</ span >
174+ < span class ="k "> return</ span > < span class ="bp "> self</ span >
175+
176+ < span class ="k "> def</ span > < span class ="fm "> __exit__</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ,</ span > < span class ="n "> A</ span > < span class ="p "> ,</ span > < span class ="n "> B</ span > < span class ="p "> ,</ span > < span class ="n "> C</ span > < span class ="p "> ):</ span >
177+ < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> close</ span > < span class ="p "> ()</ span > </ div >
143178</ pre > </ div >
144179
145180 </ div >
0 commit comments