<div dir="ltr">Honestly, I don't understand the issue. (Or maybe I'm too tired right now.)<div>But I think asyncio is actually very well designed. We just have to keep in mind that code is either synchronous or asynchronous. Code that consumes too much CPU or does blocking calls does definitely not belong in an event driven system.</div><div><div><br></div><div>By the way, the shell equivalent of "&" is definitely a thread, not a coroutine. And "fg" (foreground) equals "thread.join".</div><div><br></div></div><div>You were also talking about a Repl. Not sure if this helps, but "ptpython", the REPL that I develop can be embedded into any application as a coroutine. There is no blocking I/O in the Repl.</div><div><a href="https://github.com/jonathanslenders/ptpython/blob/master/examples/asyncio-python-embed.py">https://github.com/jonathanslenders/ptpython/blob/master/examples/asyncio-python-embed.py</a></div><div><br></div><div>@nick: About the discussion you are referring to. For solving the producer/consumer problem, the answer is probably to use asyncio Queues (Have a look at the put and get method.)<br></div><div><br></div><div>Jonathan</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-08-11 23:26 GMT+02:00 Sven R. Kunze <span dir="ltr"><<a href="mailto:srkunze@mail.de" target="_blank">srkunze@mail.de</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">@Nick<br>
<br>
It seems like, we are not alone in our thinking that asyncio still needs many more convenience wrappers.<br>
<br>
<a href="https://mail.python.org/pipermail/python-list/2015-August/694859.html" rel="noreferrer" target="_blank">https://mail.python.org/pipermail/python-list/2015-August/694859.html</a><br>
<br>
Same conclusion as yours and mine:<br>
<br>
"I think python's non blocking I/O is far from being something useful for developers till non-async code can invoke async code transparently. Duplicating all code/libs when you realize that something not fits asyncio is not a solution and even less a pythonic solution."<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
On 12.07.2015 04:48, Nick Coghlan wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On 11 July 2015 at 20:17, Nick Coghlan <<a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I'll sleep on that, and if I still like that structure in the morning,<br>
I'll look at revising my coroutine posts.<br>
</blockquote>
I've revised both of my asyncio posts to use this three part helper<br>
API to work with coroutines and the event loop from the interactive<br>
prompt:<br>
<br>
* run_in_foreground<br>
* schedule_coroutine<br>
* call_in_background<br>
<br>
I think the revised TCP echo client and server post is the better of<br>
the two descriptions, since it uses actual network IO operations as<br>
its underlying example, rather than toy background timers:<br>
<a href="http://www.curiousefficiency.org/posts/2015/07/asyncio-tcp-echo-server.html" rel="noreferrer" target="_blank">http://www.curiousefficiency.org/posts/2015/07/asyncio-tcp-echo-server.html</a><br>
<br>
As with most of the main asyncio API, "run" in this revised setup now<br>
refers specifically to running the event loop. ("run_in_executor" is<br>
still an anomaly, which I now believe might have been better named<br>
"call_in_executor" to align with the call_soon, call_soon_threadsafe<br>
and call_later callback management APIs, rather than the run_* event<br>
loop invocation APIs)<br>
<br>
The foreground/background split is now intended to refer primarily to<br>
"main thread in the main process" (e.g. the interactive prompt, the<br>
GUI thread in a desktop application, the main server process in a<br>
network application) vs "worker threads and processes" (whether<br>
managed by the default executor, or another executor passed in<br>
specifically to "call_in_background"). This is much closer in spirit<br>
to the shell meaning.<br>
<br>
The connection that "call_in_background" has to asyncio over using<br>
concurrent.futures directly is that, just like schedule_coroutine,<br>
it's designed to be used in tandem with run_in_foreground (either<br>
standalone, or in combination with asyncio.wait, or asyncio.wait_for)<br>
to determine if the results are available yet.<br>
<br>
Both schedule_coroutine and call_in_background are deliberately<br>
restricted in the kinds of objects they accept - unlike ensure_future,<br>
schedule_coroutine will complain if given an existing future, while<br>
call_in_background will complain immediately if given something that<br>
isn't some kind of callable.<br>
<br>
Regards,<br>
Nick.<br>
<br>
</blockquote>
<br></div></div><div class="HOEnZb"><div class="h5">
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</div></div></blockquote></div><br></div>