> On Mar 10, 2021, at 3:09 AM, Peter Westlake <peter.westl...@pobox.com> wrote: > > On Tue, 9 Mar 2021, at 19:28, Glyph wrote: >> >> >>> On Mar 9, 2021, at 4:54 AM, Peter Westlake <peter.westl...@pobox.com> wrote: >>> >>> I'm getting a "maximum recursion depth exceeded" error that appears to be >>> coming from flatten(). The odd thing is that it only happens sometimes. The >>> HTML that's being flattened does have a few Deferreds in it. Those come >>> from function calls, which cache the results, which might explain why I >>> only see the error on the first visit to the page (as far as I can tell). >>> >>> The system recursion limit is the standard 1000. My HTML is only nested a >>> few tags deep, two orders of magnitude short of that. Is there anything >>> about the way flatten() works that might cause this behaviour? >> >> flatten() can definitely result in some deep recursive stacks, >> particularly in combination with synchronous Deferreds which have their >> own accumulating stack costs. I'd be interested to see a minimal >> reproducer for this though, I'm sure we could do a lot better. > > Here it is: > > import sys > from twisted.internet import reactor, defer, task > from twisted.web.template import flatten > > def output(stuff): > sys.stdout.write(stuff.decode()) > > def sync(reactor): > return flatten(None, [defer.succeed(str(i)+'\n') for i in range(1000)], > output) > > task.react(sync) > > > It fails after printing 197 lines. The same sort of thing using deferLater > instead of defer.succeed printed 1000 without error. > > Peter.
Would you mind filing a ticket in trac, or digging one up if you can find it? This problem rings a bell, and I think I might actually have some code for this lying around somewhere already. -g _______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python