Thank you! Using put! callback to control backpressure is a very elegant 
solution. BTW there always has to be blocking somewhere. Netty uses 
selector to block at [1] and .setAutoRead causes respective channel to 
deregister itself from a selector [2], until put! completes.

Regarding the other way around, it seems to me from the quick look (sorry 
if I misinterpreted) that using futures to represent write completion will 
cause the eventual backpressure to block the thread, causing analogous 
drawback as a blocking put! in the "reading from multiple connection" case.

[1] 
https://github.com/netty/netty/blob/220660e351b2a22112b19c4af45e403eab1f73ab/transport/src/main/java/io/netty/channel/nio/NioEventLoop.java#L625
[2] 
https://github.com/netty/netty/blob/220660e351b2a22112b19c4af45e403eab1f73ab/transport/src/main/java/io/netty/channel/nio/AbstractNioChannel.java#L173

Jozef

On Wednesday, October 8, 2014 7:16:44 PM UTC+2, Zach Tellman wrote:
>
> The documentation for Manifold can explain the API better than I can 
> here.  The point where that interacts with Netty w.r.t. backpressure is 
> here: 
> https://github.com/ztellman/aleph/blob/0.4.0/src/aleph/netty.clj#L109.  
> Here the stream represents data coming off the wire, and if the put onto 
> the stream is not immediately successful, backpressure is enabled until the 
> put completes.  No blocking required anywhere.
>
> On Wed, Oct 8, 2014 at 10:10 AM, Jozef Wagner <jozef....@gmail.com 
> <javascript:>> wrote:
>
>> If you want to handle multiple TCP connections and async channels in one 
>> thread, you need a way how to block on both connections (wait for new input 
>> to arrive) and channels (wait for a free space in a buffer). Blocking only 
>> on connections will get you a busy loop if channels are full. If you could 
>> point me to the part of Aleph sources that handles this issue, I would be 
>> very grateful. I'm not familiar with netty API nor manifold's concepts, so 
>> I'm having trouble navigating in the Aleph sources.
>>
>> Thanks,
>> Jozef
>>
>> On Wednesday, October 8, 2014 6:15:47 PM UTC+2, Zach Tellman wrote:
>>>
>>> I wasn't aware of hermod, that's interesting.  I would still 
>>> characterize its approach to backpressure as "broken", though, since when 
>>> the queues get full it silently drops messages on the ground.  In fairness, 
>>> this is very clearly documented, so it's less pernicious than some of the 
>>> other cases out there.
>>>
>>> Both core.async buffers and SelectableChannels have very particular 
>>> semantics, and I would be very surprised if they could be combined in that 
>>> way.  It's perfectly possible to feed one into the other and handle 
>>> backpressure properly (again, I'm doing just that with Aleph 0.4.0, using 
>>> Netty), but it's a nuanced integration and easy to get wrong.
>>>
>>> On Wed, Oct 8, 2014 at 7:12 AM, <adrian...@mail.yu.edu> wrote:
>>>
>>>> Check out https://github.com/halgari/com.tbaldridge.hermod for an 
>>>> interesting take on this. 
>>>>
>>>> On Wednesday, October 8, 2014 1:17:11 AM UTC-4, Sun Ning wrote:
>>>>>
>>>>>  BTW, is there any network based core.async channel available now?
>>>>>
>>>>> On 10/08/2014 04:36 AM, adrian...@mail.yu.edu wrote:
>>>>>  
>>>>>  It's not about 'safety' (depending on what that means in this 
>>>>> context), but as Zach pointed out, if you aren't careful about 
>>>>> backpressure 
>>>>> you can run into performance bottlenecks with unrestrained async IO 
>>>>> operations because although they let you code as if you could handle an 
>>>>> unlimited amount of connections, obviously that isn't true. There is only 
>>>>> a 
>>>>> finite amount of data that can be buffered in and out of any network 
>>>>> according to its hardware. When you don't regulate that, your system will 
>>>>> end up spending an inordinate amount of time compensating for this. You 
>>>>> don't need to worry about this with "regular io" because the "thread per 
>>>>> connection" abstraction effectively bounds your activity within the 
>>>>> acceptable physical constraints of the server. 
>>>>>
>>>>> On Tuesday, October 7, 2014 2:49:30 PM UTC-4, Brian Guthrie wrote: 
>>>>>>
>>>>>>  
>>>>>> On Mon, Oct 6, 2014 at 12:10 AM, <adrian...@mail.yu.edu> wrote:
>>>>>>
>>>>>>> Zach makes an excellent point; I've used AsyncSocketChannels and its 
>>>>>>> irk (http://docs.oracle.com/javase/8/docs/api/java/nio/channels/
>>>>>>> AsynchronousServerSocketChannel.html), with core.async in the past. 
>>>>>>> Perhaps replacing your direct java.net.Sockets with nio classes that 
>>>>>>> can be 
>>>>>>> given CompletionHandlers (http://docs.oracle.com/javase
>>>>>>> /7/docs/api/java/nio/channels/CompletionHandler.html) would be a 
>>>>>>> better fit. 
>>>>>>>
>>>>>>  
>>>>>> Once I do some performance instrumentation I'll give that a shot. I 
>>>>>> admit that I'm not familiar with all the implications of using the nio 
>>>>>> classes; were I to switch, is it safe to continue using go blocks, or is 
>>>>>> it 
>>>>>> worth explicitly allocating a single thread per socket?
>>>>>>
>>>>>>  Brian
>>>>>>  
>>>>>  -- 
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Clojure" group.
>>>>> To post to this group, send email to clo...@googlegroups.com
>>>>> Note that posts from new members are moderated - please be patient 
>>>>> with your first post.
>>>>> To unsubscribe from this group, send email to
>>>>> clojure+u...@googlegroups.com
>>>>> For more options, visit this group at
>>>>> http://groups.google.com/group/clojure?hl=en
>>>>> --- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "Clojure" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to clojure+u...@googlegroups.com.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>>
>>>>>   -- 
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To post to this group, send email to clo...@googlegroups.com
>>>> Note that posts from new members are moderated - please be patient with 
>>>> your first post.
>>>> To unsubscribe from this group, send email to
>>>> clojure+u...@googlegroups.com
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/clojure?hl=en
>>>> --- 
>>>> You received this message because you are subscribed to a topic in the 
>>>> Google Groups "Clojure" group.
>>>> To unsubscribe from this topic, visit https://groups.google.com/d/
>>>> topic/clojure/TVMQJwaij1U/unsubscribe.
>>>> To unsubscribe from this group and all its topics, send an email to 
>>>> clojure+u...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com 
>> <javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> --- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "Clojure" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/clojure/TVMQJwaij1U/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> clojure+u...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to