Path: csiph.com!usenet.pasdenom.info!news.etla.org!news.stack.nl!newsfeed.xs4all.nl!newsfeed4a.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'syntax': 0.04; 'concurrently': 0.07; 'method.': 0.07; 'deprecated': 0.09; 'e.g.,': 0.09; 'emulate': 0.09; 'executed': 0.09; 'friday,': 0.09; 'highlighting': 0.09; 'received:80.91': 0.09; 'received:80.91.229': 0.09; 'received:gmane.org': 0.09; 'received:list': 0.09; 'things,': 0.09; 'works.': 0.09; 'api': 0.11; 'python': 0.11; 'bug': 0.12; '[3],': 0.16; '[4]:': 0.16; '[5]': 0.16; 'benjamin': 0.16; 'concurrent': 0.16; 'deprecated,': 0.16; 'docs.': 0.16; 'etc...': 0.16; 'finishes': 0.16; 'localhost': 0.16; 'reason).': 0.16; 'received:80.91.229.3': 0.16; 'received:plane.gmane.org': 0.16; 'ssh': 0.16; 'url:detail': 0.16; 'url:issues': 0.16; 'url:peps': 0.16; 'wrote:': 0.18; 'all,': 0.19; 'trying': 0.19; 'connects': 0.19; 'programming': 0.22; 'handles': 0.22; 'preferred': 0.22; 'header:User-Agent:1': 0.23; 'mind.': 0.24; 'sends': 0.24; "shouldn't": 0.24; 'subject:problem': 0.24; 'url:dev': 0.24; 'looks': 0.24; 'question': 0.24; 'first,': 0.26; 'task': 0.26; 'pass': 0.26; 'header:X-Complaints-To:1': 0.27; 'function': 0.29; 'appreciated.': 0.29; '[1]': 0.29; 'url:code': 0.29; "doesn't": 0.30; '[2]': 0.30; 'mix': 0.30; 'programming.': 0.30; 'skip:( 20': 0.30; "i'm": 0.30; 'code': 0.31; 'directly,': 0.31; 'provided,': 0.31; 'writes:': 0.31; 'probably': 0.32; 'run': 0.32; 'another': 0.32; 'url:python': 0.33; 'skip:_ 10': 0.34; 'could': 0.34; 'advice': 0.35; 'connection': 0.35; 'but': 0.35; 'there': 0.35; 'dance': 0.36; 'machine.': 0.36; 'yield': 0.36; 'url:org': 0.36; 'should': 0.36; 'two': 0.37; 'project': 0.37; 'message- id:@gmail.com': 0.38; 'server': 0.38; 'thank': 0.38; 'connections': 0.38; 'tasks': 0.38; 'url:library': 0.38; 'writes': 0.38; 'needed': 0.38; 'to:addr:python-list': 0.38; 'issue': 0.38; 'though,': 0.39; 'to:addr:python.org': 0.39; 'received:org': 0.40; 'how': 0.40; 'read': 0.60; 'helps': 0.61; 'url:3': 0.61; 'traffic': 0.61; 'back': 0.62; 'kind': 0.63; 'such': 0.63; 'myself': 0.63; 'reached': 0.63; 'url:p': 0.64; 'forward': 0.65; 'response.': 0.68; 'listening': 0.74; 'saw': 0.77; 'forth': 0.81; 'asynchronous': 0.84; 'end.': 0.84; 'of*': 0.84; 'short,': 0.84; 'received:89': 0.85; 'don\xe2\x80\x99t': 0.91; 'procedural': 0.91; 'subject:looking': 0.91 X-Injected-Via-Gmane: http://gmane.org/ To: python-list@python.org From: Akira Li <4kir4.1i@gmail.com> Subject: Re: Asyncio problem, looking for advice. Date: Sat, 29 Nov 2014 00:04:56 +0300 References: <574feffa-6412-4ae3-8de0-f84b0bdba9d2@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Gmane-NNTP-Posting-Host: 89.169.229.68 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) Cancel-Lock: sha1:wEwE+/Eb1MVocwWHSpmVQim+XB4= X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 98 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1417208785 news.xs4all.nl 2914 [2001:888:2000:d::a6]:55966 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:81703 Benjamin Risher writes: > On Friday, November 28, 2014 6:12:20 AM UTC-6, Akira Li wrote: >> Benjamin Risher writes: >> >> > Hello all, >> > >> > I'm working on a project to learn asyncio and network programming. >> > What I'm trying to do is forward a connection from myself to >> > another machine. Kind of like an asynchronous python >> > implementation of fpipe. >> > >> > In a nutshell: >> > >> > 1 --> start a server listening on localhost >> > 2 --> connect to server >> > 3 --> server connects to a listening service (ssh for instance) >> > 4 --> server handles both connections to pass traffic back and forth through each >> > >> > What I have now *kind of* works. It sends data back and forth, >> > but when I ssh to localhost -p 12345, i never get the password >> > prompt. It looks like one packet hangs out and doesn't get sent >> > from what I saw in tcpdump. >> > >> > Any help would be greatly appreciated. >> >> Do you want to emulate `ssh -L 12345:localhost:22 `? >> >> > Here's a link to the same code as below, just with syntax highlighting etc... >> > http://pastebin.com/iLE4GZH3 >> >> There are several issue e.g., unnecessary async(), deprecated Task() >> calls but the main issue is that _handle_client() doesn't read >> concurrently from the server while client writes to it. >> >> You could use asyncio.wait() to run several tasks in parallel > >> [1] >> https://docs.python.org/3/library/asyncio-task.html#example-parallel-execution-of-tasks >> >> [2] http://pastebin.com/g08YaJyz >> > Akira, > > First, thank you very much for your response. It helps tremendously. > I have a question or two though, if you don't mind. > > You said Task() is deprecated, but it's not listed as such in the > docs. Is it just that it's preferred to use other methods instead of > using Task() directly, or am I missing something? asyncio is a provisional API [3], it may change without notice (though it shouldn't without a reason). From asyncio docs [4]: Don’t directly create Task instances: use the async() function or the BaseEventLoop.create_task() method. The reason is probably to support Trollius (asyncio for Python 2) [5]. > Also, just so I can wrap my head around things, I was trying to mix > concurrent and procedural programming in the code I provided, correct? > Do you have any advice on how to avoid mixing types again in the > future? In short, the main issue was that your code executed some parts sequentially e.g., A then B: yield from A yield from B # this is not reached until A finishes that needed to be run concurrently: yield from asyncio.wait([A, B]) or in general, if you don't need to wait the results: asyncio.async(A) asyncio.async(B) # ... yield later, to pass the control to the event loop (Task._step/_fut_waiter dance ☯) Ask, if you have any specific questions about the code http://pastebin.com/g08YaJyz There is a bug at the end. info('done') should be outside the loop (improper indent). [3] https://www.python.org/dev/peps/pep-0411 [4] https://docs.python.org/3/library/asyncio-task.html#asyncio.Task [5] https://code.google.com/p/tulip/issues/detail?id=185 -- Akira