<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On May 24, 2010, at 5:36 AM, Brian Quinlan wrote:</div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On May 24, 2010, at 5:16 AM, Glyph Lefkowitz wrote:</div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On May 23, 2010, at 2:37 AM, Brian Quinlan wrote:</div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On May 23, 2010, at 2:44 PM, Glyph Lefkowitz wrote:</div></div></div></blockquote></div></div></blockquote></div></div></blockquote><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>ProcessPoolExecutor has the same serialization perils that multiprocessing does. My original plan was to link to the multiprocessing docs to explain them but I couldn't find them listed.</div></div></blockquote><div><br></div><div>Linking to the pickle documentation might be a good start.</div><div><br></div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>Yes, the execution context is Executor-dependent. The section under ProcessPoolExecutor and ThreadPoolExecutor spells this out, I think.</div></div></div></blockquote><div><br></div><div>I suppose so. &nbsp;I guess I'm just looking for more precise usage of terminology. (This is a PEP, after all. &nbsp;It's a specification that multiple VMs may have to follow, not just some user documentation for a package, even if they'll *probably* be using your code in all cases.) &nbsp;I'd be happier if there were a clearer term than "calls" for the things being scheduled ("submissions"?), since the done callbacks aren't called in the subprocess for ProcessPoolExecutor, as we just discussed.</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>Sure. &nbsp;Really, almost any contract would work, it just needs to be spelled out. &nbsp;It might be nice to know whether the thread invoking the callbacks is a daemon thread or not, but I suppose it's not strictly necessary.</div></div></div></blockquote><div><br></div><div>Your concerns is that the thread will be killed when the interpreter exits? It won't be.</div></div></div></blockquote><div><br></div><div>Good to know. &nbsp;Tell it to the PEP though, not me ;).</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>No reaction on [invoker vs. future]? &nbsp;I think you'll wish you did this in a couple of years when you start bumping into application code that calls "set_result" :).</div></div></div></blockquote><div><font class="Apple-style-span" color="#000000"><font class="Apple-style-span" color="#144FAE"><br></font></font></div></div></div></blockquote><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>My reactions are mixed ;-)</div></div></blockquote><div><br></div><div>Well, you are not obliged to take my advice, as long as I am not obliged to refrain from mocking you mercilessly if it happens that I was right in a couple of years ;-).</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Your proposal is to add a level of indirection to make it harder for people to call implementation methods. The downside is that it makes it a bit harder to write tests and Executors.</div></div></blockquote><div><br></div><div>Both tests and executors will still create and invoke methods directly on one object; the only additional difficulty seems to be the need to type '.future' every so often on the executor/testing side of things, and that seems a cost well worth paying to avoid confusion over who is allowed to call those methods and when.</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>I also can't see a big problem in letting people call set_result in client code though it is documented as being only for Executor implementations and tests.&nbsp;</div><div><br></div><div>On the implementation side, I don't see why an Invoker needs a reference to the future.</div></div></blockquote><div><br></div><div>Well, uh...</div><br><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>class Invoker(object):</div><div>&nbsp;&nbsp;def __init__(self):</div><div>&nbsp;&nbsp; &nbsp;"""Should only be called by Executor implementations."""</div><div>&nbsp;&nbsp; &nbsp;self.future = Future()</div></div></blockquote>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ^ this is what I'd call a "reference to the future"<br><div><br></div></div></body></html>