)]}'
{"specs/juno/oslo-messaging-greenio-executor.rst":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"bfde0667c857756577541892be8aa965a64b7e4a","unresolved":false,"context_lines":[{"line_number":203,"context_line":"Dependencies"},{"line_number":204,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"- This introduces a dependency on trollios and greenio."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"References"},{"line_number":209,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"baada198_6438b33d","line":206,"updated":"2014-07-04 09:11:54.000000000","message":"trollius","commit_id":"8a566fda4ad906dea53257e53a83a8b00d8d8497"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"c34915e3a41009a1821c39e887f8ae35c3ae3036","unresolved":false,"context_lines":[{"line_number":203,"context_line":"Dependencies"},{"line_number":204,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"- This introduces a dependency on trollios and greenio."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"References"},{"line_number":209,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"baada198_3506e31d","line":206,"in_reply_to":"baada198_6438b33d","updated":"2014-07-04 10:10:09.000000000","message":"Done","commit_id":"8a566fda4ad906dea53257e53a83a8b00d8d8497"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"c7fc7e670fa7765c5a1fb992367ef66b4b994885","unresolved":false,"context_lines":[{"line_number":238,"context_line":""},{"line_number":239,"context_line":"  http://blogs.gnome.org/markmc/2013/06/04/async-io-and-python/"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"greenio - greelets support for asyncio:"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"  https://github.com/1st1/greenio/"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"baada198_b55cb34c","line":241,"updated":"2014-07-04 10:50:19.000000000","message":"typo: greenlets","commit_id":"eefd7eee4aa813db57473eaeef7719af1178b250"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"146f0961d71e04bae8fb8712e5dd01da56527835","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"  @asyncio.coroutine"},{"line_number":40,"context_line":"  def foo(self):"},{"line_number":41,"context_line":"      result \u003d yield from some_async_op(...)"},{"line_number":42,"context_line":"      return do_stuff(result)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"or::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_89e69442","line":41,"updated":"2014-07-07 12:19:53.000000000","message":"Since we need to support Python 2, Trollius must be used instead of asyncio. Trollius uses \"yield From(...)\" for coroutines:\nhttp://trollius.readthedocs.org/#differences-between-trollius-and-tulip\n\nYou may also use @trollius.coroutine instead instead of @asyncio.coroutine. I suggest to write \"from trollius import From, Return\" to make the code more readable and look closer to asyncio coroutines.","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"834dc9042f2ca02eb1cef385e1c1f93e30e6c13c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"   with a coroutine endpoint method, we send the reply from a"},{"line_number":73,"context_line":"   greenthread so that the dispatch greenthread doesn\u0027t get blocked if"},{"line_number":74,"context_line":"   the incoming.reply() call causes a greenlet context switch."},{"line_number":75,"context_line":"#. When all of ceilometer has been ported over to asyncio coroutines,"},{"line_number":76,"context_line":"   we can stop monkey patching, stop using greenio and switch to the"},{"line_number":77,"context_line":"   asyncio event loop"},{"line_number":78,"context_line":"#. When we make this change, we\u0027ll want a completely native asyncio"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_70c21886","line":75,"updated":"2014-07-05 16:53:45.000000000","message":"This slightly feels out of place in this spec. The spec talks about oslo.messaging then it jumps into saying to port all of ceilometer to asyncio coroutines. Maybe this can be better worded or something? (or placed under a use-cases section or other?)","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1ab2bbf40bcba9c31ccdf4d42d1991756b1e8307","unresolved":false,"context_lines":[{"line_number":77,"context_line":"   asyncio event loop"},{"line_number":78,"context_line":"#. When we make this change, we\u0027ll want a completely native asyncio"},{"line_number":79,"context_line":"   oslo.messaging executor. Unless the oslo.messaging drivers support"},{"line_number":80,"context_line":"   asyncio themselves, that executor will probably need a separate"},{"line_number":81,"context_line":"   native thread to poll for messages and send replies."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"This spec specifically proposes the addition of a \u0027greenio\u0027 executor"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_df294138","line":80,"updated":"2014-07-04 14:30:49.000000000","message":"IIUC this will mean that the libraries that drivers use also need to support asyncio (actually trollius since we are on python 2.7 and that is even more unlikely to happen) meaning provide their own protocols - or run that code in executors (what you say here). This is a relatively big caveat.","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"2d61055c9904d43be8953c6cabf819de6db0a4c4","unresolved":false,"context_lines":[{"line_number":77,"context_line":"   asyncio event loop"},{"line_number":78,"context_line":"#. When we make this change, we\u0027ll want a completely native asyncio"},{"line_number":79,"context_line":"   oslo.messaging executor. Unless the oslo.messaging drivers support"},{"line_number":80,"context_line":"   asyncio themselves, that executor will probably need a separate"},{"line_number":81,"context_line":"   native thread to poll for messages and send replies."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"This spec specifically proposes the addition of a \u0027greenio\u0027 executor"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_eaf9e580","line":80,"in_reply_to":"baada198_df294138","updated":"2014-07-04 14:46:11.000000000","message":"No, I see the asyncio executor as supporting multiple polling modes - http://lists.openstack.org/pipermail/openstack-dev/2013-June/009934.html\n\nThe modes would be - async/trollius poll_async() coroutine, a blocking/synchronous poll() method called from a separate native thread or a readable pollfd which we can select to know that a synchronous poll() isn\u0027t going to block\n\nSo, initially the drivers would not change, but we\u0027d be able to port them to either of the other two modes in future","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"e0204833a8256c5427e45d9c091b127c9da8448d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"   asyncio event loop"},{"line_number":78,"context_line":"#. When we make this change, we\u0027ll want a completely native asyncio"},{"line_number":79,"context_line":"   oslo.messaging executor. Unless the oslo.messaging drivers support"},{"line_number":80,"context_line":"   asyncio themselves, that executor will probably need a separate"},{"line_number":81,"context_line":"   native thread to poll for messages and send replies."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"This spec specifically proposes the addition of a \u0027greenio\u0027 executor"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_657b46f5","line":80,"in_reply_to":"baada198_eaf9e580","updated":"2014-07-04 15:14:13.000000000","message":"Ok fair enough, but we better do it sooner rather than later when we switch out the eventlet since at that point we will be doing basically native threading at that point. Or am I wrong?","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1ab2bbf40bcba9c31ccdf4d42d1991756b1e8307","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    while True:"},{"line_number":87,"context_line":"        incoming \u003d self.listener.poll()"},{"line_number":88,"context_line":"        method \u003d dispatcher.get_endpoint_method(incoming)"},{"line_number":89,"context_line":"        if asyncio.iscoroutinefunc(method):"},{"line_number":90,"context_line":"            fut \u003d asyncio.Task(method())"},{"line_number":91,"context_line":"            fut.add_done_callback(lambda fut: incoming.reply(fut.result()))"},{"line_number":92,"context_line":"        else:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_bf7acd74","line":89,"updated":"2014-07-04 14:30:49.000000000","message":"I am assuming that this uses an eventloop in a separate OS thread similar to the one in  https://review.openstack.org/#/c/70948/ ?\n\nOr are you actually proposing in the second # of the plan above to write our own EvenLoop that schedules to greenthreads (this is what greenio does I assume although I am not sure you meant https://pypi.python.org/pypi/greenio/0.5.0 as this is py3 only). In that case - the biggest problem I see is that it would be super easy to sneak blocking code into coroutines and never find out until we actually move to asyncio completely?","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"2d61055c9904d43be8953c6cabf819de6db0a4c4","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    while True:"},{"line_number":87,"context_line":"        incoming \u003d self.listener.poll()"},{"line_number":88,"context_line":"        method \u003d dispatcher.get_endpoint_method(incoming)"},{"line_number":89,"context_line":"        if asyncio.iscoroutinefunc(method):"},{"line_number":90,"context_line":"            fut \u003d asyncio.Task(method())"},{"line_number":91,"context_line":"            fut.add_done_callback(lambda fut: incoming.reply(fut.result()))"},{"line_number":92,"context_line":"        else:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_8a8069c1","line":89,"in_reply_to":"baada198_bf7acd74","updated":"2014-07-04 14:46:11.000000000","message":"Yes, we\u0027re talking about using greenio\u0027s greenlet based asyncio EventLoop and Victor has ported it to py2 with trollius - https://github.com/1st1/greenio/pull/5\n\nYes, figuring out how to detect blocking code in greenio coroutines is going to be important","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1ab2bbf40bcba9c31ccdf4d42d1991756b1e8307","unresolved":false,"context_lines":[{"line_number":101,"context_line":"to send the reply back to the client."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Alternatives"},{"line_number":104,"context_line":"------------"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"The alternative is to add an asyncio executor which can only schedule asyncio"},{"line_number":107,"context_line":"coroutines to the asyncio eventloop. This would mean all code in a service"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_bf81edc4","line":104,"updated":"2014-07-04 14:30:49.000000000","message":"Another alternative would be a mix between this and https://review.openstack.org/#/c/70948/ where you do eventlet + asyncio in a separate thread which will give you an indication that you are totally blocking when you should not be earlier I believe - although (not knowing much about celio code) that has a huge drawback of not being able to sync between different eventlet and asyncio coroutines (Nova likely needs this). in that case it would be best to move things that need syncing in a lockstep.\n\nActually come to think of it - this is the problem in your proposal too except you could shamelessly be using eventlet semaphores etc in coroutines which is slightly horrible.","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"146f0961d71e04bae8fb8712e5dd01da56527835","unresolved":false,"context_lines":[{"line_number":101,"context_line":"to send the reply back to the client."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Alternatives"},{"line_number":104,"context_line":"------------"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"The alternative is to add an asyncio executor which can only schedule asyncio"},{"line_number":107,"context_line":"coroutines to the asyncio eventloop. This would mean all code in a service"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_1728dc98","line":104,"in_reply_to":"baada198_02cd04b7","updated":"2014-07-07 12:19:53.000000000","message":"\u003e I\u0027ve put together a POC of this - we can maybe discuss on the list?\n\nSure. I\u0027m only watching emails on openstack-dev with [Oslo] in the title.\n\nI\u0027m not saying that it\u0027s impossible to run eventlet and asyncio in the same process, more that it\u0027s not a good idea. For example, it problably requires to use a new thread, which may not be a good idea since OpenStack is not using threads currently, so you may get troubles with real concurrent access (need to add real locks).\n\nThe greenio approach makes the transition softer. For example, it doesn\u0027t need to modify Ceilometer \"main\" function to block on loop.run_forever().\n\nThe work on Ceilometer will probably help to identify code relying on implicit task switching, and so patch the code to switch explicitly (using \"yield\").","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"57729c4087ce0df95d60f1d7f827076b15b94bdd","unresolved":false,"context_lines":[{"line_number":101,"context_line":"to send the reply back to the client."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Alternatives"},{"line_number":104,"context_line":"------------"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"The alternative is to add an asyncio executor which can only schedule asyncio"},{"line_number":107,"context_line":"coroutines to the asyncio eventloop. This would mean all code in a service"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_c966cc29","line":104,"in_reply_to":"baada198_1728dc98","updated":"2014-07-07 12:32:38.000000000","message":"\u003e  For example, it problably requires to use a new thread, which may not be a good idea since OpenStack is not using threads currently, so you may get troubles with real concurrent access (need to add real locks).\n\nWell - the little example I posted does not need this for the oslo.messaging general case (where we just fire off a thing and collect the result/exception (I used a small hack to accomplish this) so no thread level locking needed. \n\nFWIW - if you look at the libvirt driver in nova - we do use real threads there in a similar way so it\u0027s not really beyond us :). And I think oslo.messaging change would be less hacky that what we do there.","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"e0204833a8256c5427e45d9c091b127c9da8448d","unresolved":false,"context_lines":[{"line_number":101,"context_line":"to send the reply back to the client."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Alternatives"},{"line_number":104,"context_line":"------------"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"The alternative is to add an asyncio executor which can only schedule asyncio"},{"line_number":107,"context_line":"coroutines to the asyncio eventloop. This would mean all code in a service"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_e521164e","line":104,"in_reply_to":"baada198_6ac95525","updated":"2014-07-04 15:14:13.000000000","message":"That would have to stay in the eventlet thread  - but I see what I missed. Dispatcher calls reply() on the message, and we would be in a different thread.\n\nSeems like it would not be impossible to hack the dispatcher to play nicely with this by just returning the value of the method, however I am not sure how far this would complicate switching to full asyncio once we are done.\n\nThoughts?","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e5612f06c34b1a53cbe343afa1fea0ec05025013","unresolved":false,"context_lines":[{"line_number":101,"context_line":"to send the reply back to the client."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Alternatives"},{"line_number":104,"context_line":"------------"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"The alternative is to add an asyncio executor which can only schedule asyncio"},{"line_number":107,"context_line":"coroutines to the asyncio eventloop. This would mean all code in a service"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_d050440d","line":104,"in_reply_to":"baada198_bf81edc4","updated":"2014-07-05 16:23:53.000000000","message":"I\u0027m not sure that it\u0027s safe to run two event loops, eventlet and asyncio, in the same process. For example, eventlet monkey patchs the threading module, so it\u0027s not possible to use a real thread.\n\nThanks to greenio, it\u0027s possible to execute asyncio callbacks and asyncio coroutines in greenthreads, using only one OS thread.","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"2d61055c9904d43be8953c6cabf819de6db0a4c4","unresolved":false,"context_lines":[{"line_number":101,"context_line":"to send the reply back to the client."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Alternatives"},{"line_number":104,"context_line":"------------"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"The alternative is to add an asyncio executor which can only schedule asyncio"},{"line_number":107,"context_line":"coroutines to the asyncio eventloop. This would mean all code in a service"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_6ac95525","line":104,"in_reply_to":"baada198_bf81edc4","updated":"2014-07-04 14:46:11.000000000","message":"Say you have two native threads and two event loops - which one polls the connection to the AMQP broker?","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"f5bbd57d45b4ed5d147762b7d3d7194045c0a15f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"to send the reply back to the client."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Alternatives"},{"line_number":104,"context_line":"------------"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"The alternative is to add an asyncio executor which can only schedule asyncio"},{"line_number":107,"context_line":"coroutines to the asyncio eventloop. This would mean all code in a service"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_02cd04b7","line":104,"in_reply_to":"baada198_d050440d","updated":"2014-07-07 10:05:14.000000000","message":"I\u0027ve put together a POC of this - we can maybe discuss on the list?","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":1297,"name":"Joshua Harlow","email":"jxharlow@godaddy.com","username":"harlowja"},"change_message_id":"834dc9042f2ca02eb1cef385e1c1f93e30e6c13c","unresolved":false,"context_lines":[{"line_number":128,"context_line":"------------------"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"In theory, there could be differences in the performance of endpoint methods"},{"line_number":131,"context_line":"ported to be asyncio coroutines but we have no idea yet."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"Configuration Impact"},{"line_number":134,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_b0b83012","line":131,"updated":"2014-07-05 16:53:45.000000000","message":"Would the osprofiler work help here?","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"1ab2bbf40bcba9c31ccdf4d42d1991756b1e8307","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"The mock-up of an asyncio executor Mark wrote (and never tested):"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"  https://github.com/markmc/oslo-incubator/blob/8509b8b/openstack/common/messaging/_executors/impl_tulip.py"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Mark\u0027s blog post on async I/O and Python:"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_8af069ff","line":243,"updated":"2014-07-04 14:30:49.000000000","message":"This is yet another approach where we immediately move to asyncio/trollius but escape to threads for blocking stuff (it misses checking if callbacks are coroutintes but that is a relatively easy addition).\n\nWhy not go with this first?","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"e5612f06c34b1a53cbe343afa1fea0ec05025013","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"The mock-up of an asyncio executor Mark wrote (and never tested):"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"  https://github.com/markmc/oslo-incubator/blob/8509b8b/openstack/common/messaging/_executors/impl_tulip.py"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Mark\u0027s blog post on async I/O and Python:"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_f0538814","line":243,"in_reply_to":"baada198_8af069ff","updated":"2014-07-05 16:23:53.000000000","message":"\"This is yet another approach where we immediately move to asyncio/trollius but escape to threads for blocking stuff\"\n\nI don\u0027t think that it would work. There are blocking tasks which should really run \"in parallel\" (not block them each other). For example, Olso Messaging \"blocks\" until it receives a message, but you may also want to \"block\" on sending a RPC request.\n\nModifying OpenStack is done incrementally. It\u0027s not possible to change everything in a single commit. For example, the Service class of Olso Incubator heavily depends on eventlet. It\u0027s not \"asyncio\" compatible.","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"2d61055c9904d43be8953c6cabf819de6db0a4c4","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"The mock-up of an asyncio executor Mark wrote (and never tested):"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"  https://github.com/markmc/oslo-incubator/blob/8509b8b/openstack/common/messaging/_executors/impl_tulip.py"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Mark\u0027s blog post on async I/O and Python:"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_aae60dae","line":243,"in_reply_to":"baada198_8af069ff","updated":"2014-07-04 14:46:11.000000000","message":"I\u0027d be very nervous about jumping from single-native-thread-with-implicit-cooperative-coroutines to multiple-native-threads. I\u0027m much more comfortable with the idea of single-native-thread-with-mixture-of-implicit-and-explicit-cooperative-corountines","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"e0204833a8256c5427e45d9c091b127c9da8448d","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"The mock-up of an asyncio executor Mark wrote (and never tested):"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"  https://github.com/markmc/oslo-incubator/blob/8509b8b/openstack/common/messaging/_executors/impl_tulip.py"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Mark\u0027s blog post on async I/O and Python:"},{"line_number":246,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"baada198_05d0caf4","line":243,"in_reply_to":"baada198_aae60dae","updated":"2014-07-04 15:14:13.000000000","message":"I would probably I agree with you, although this seems like a much cleaner approach looking at the code. We would basically lose the async-ness completely which is silly.","commit_id":"42adee84c25f8d918b77e866456fb0b7fced2a04"}]}
