[Twisted-Python] Streaming in AMP

Hi, Glyph has been kind enough to share some of his ideas about adding streaming support to AMP via private mail. He suggested that the discussion should really be on the list. Here's the relevant technical details we've discussed so far: (I made the comments in quotes; Glyph's response follows)
Since there is basically about a 5% probability that I will actually manage to write something that looks like a spec, let me take this random email response as an opportunity to get started. The protocol limitation in AMP of 64k per value is intentional, and in fact, should regarded as a very high end for a per-packet payload. The idea of AMP is that the connection should be a multiplexable resource which can do lots of things at the same time; if you start plugging it up with megabyte-at-a-time payloads, then when you send a packet over it, it's not going to get there in a reasonable time frame. So the idea behind AMP streaming is that there should be a parameter type which presents an API that allows you to deal with a "large" value that might be a multi-gigabyte stream, chunked up into smaller fragments so that you can have one connection downloading multiple things. I haven't completely decided on the API yet, but just to give you an idea of where I'm going: class Put(amp.Command): arguments = [('upload', amp.Upload()), ('filename', amp.Unicode())] # ... def put(upload, filename): def saveResult(result): f = file(filename, 'wb') f.write(result) f.close() upload.fullResultAsString().addCallback(saveResult) return {} Put.responder(put) This is a straw-man API because the *suggested* API for doing something like this would be to incrementally write the results to a file as they're available, but a hacky convenience API like this might be useful in some applications (and as an example it's less code to write). Another, possibly better convenience API might be 'fullResultAsTemporaryFile'. The implementation technique here would be to make the AMP protocol object a multiplexable consumer, and establish a convention (perhaps some built-in commands?) for sending chunks of a previously-identified file object. You can find the notifications involved in this process documented here: http://twistedmatrix.com/projects/core/documentation/howto/producers.html Is this helpful as the beginnings of a specification? Let me know if you need more information.

On 10:35 pm, jkakar@kakar.ca wrote:
*snip* As a finger-exercise today I banged out a tedious, untested and highly buggy proof-of-concept of the API proposed there. It seems to work OK; the main open question is how the command-responders for "you got a chunk of data on this channel", "please throttle this channel", and "this channel is done" should be associated with the protocol.

On 10:35 pm, jkakar@kakar.ca wrote:
*snip* As a finger-exercise today I banged out a tedious, untested and highly buggy proof-of-concept of the API proposed there. It seems to work OK; the main open question is how the command-responders for "you got a chunk of data on this channel", "please throttle this channel", and "this channel is done" should be associated with the protocol.
participants (2)
-
glyph@divmod.com
-
Jamu Kakar