Am Donnerstag, 22. Mai 2014 00:04:58 UTC+2 schrieb Guido van Rossum:

Can you show the code you are referring to? I cannot figure out what your 
> question is from your description.
>
Sure!

#i can’t change thisclass ThirdPartyJob:
    def __init__(self, cb):
        self.callback = cb

    def do_things(self):
        for _ in range(200):
            message = churn()
            callback(message)
#i can change everything hereclass MyServerProtocol:
    def __init__(self):
        self.task = None

    @coroutine
    def onMessage(self, msg):
        if msg == 'cancel':
            self.task.cancel()
        else:
            self.task = async(self.do_task(msg))
            yield from self.task
        self.task = None

    @coroutine
    def do_task(self, msg):
        def cb(m):
            #i want to yield do_task from here if possible
            print(m)
        job = ThirdPartyJob(cb)
        job.do_things()

so the server gets messages, and calls the 3rd party code unless the 
message is to cancel the last order, in which case this should get done, 
and then the server should wait for the next message.

this would work if, instead of job.do_things(), i would use a loop and 
yield inside of it. but that’s impossible:

this is a simplified version.

in reality, the third party job does things that can’t be reimplemented 
easily, and the loop sits pretty deep, so no reimplementing of everything 
down to the loop.
​

Reply via email to