繁体   English   中英

具有相同协程的多个线程?

[英]Multiple threads with the same coroutine?

我可以运行运行协同程序相同副本的多个线程吗?

例如,如果我将线程功能从本教程更改为

@coroutine
def threaded(count, target):
    messages = Queue()
    def run_target():
        while True:
            item = messages.get()
            if item is GeneratorExit:
                target.close()
                return
            else:
                target.send(item)

    for i in xrange(count):
        Thread(target=run_target).start()

    try:
        while True:
            item = (yield)
             messages.put(item)
     except GeneratorExit:
         messages.put(GeneratorExit)

这真的有用吗? 如何验证它是否正常工作?

我想我已经解决了,我需要将功能更改为这样的功能才能正常工作

@coroutine
def _threaded(self, count, target_func):
    """
    Given a target coroutine, spawn $count threads to run copies of them. In
    order to properly use this, do not call the coroutine before calling this,
    e.g.

        @coroutine
        def foo(self):
            ...

        def bar(self):
            ...
            self._threaded(10, self.foo)    # <- do not call self.foo,
                                            # just the reference

    @param count        The number of threads to spawn
    @param target_func  The reference to the target coroutine
    @returns            The subnet mask
    """
    result = None

    messages = Queue()

    def default_target_run(index):
        target = target_func()
        while True:
            item = messages.get()
            if item is GeneratorExit:
                target.close()
                return
            else:
                target.send({'index': index, 'item': item})

    # ensure code is testable
    target_run = default_target_run
    try:
        target_run = self._threaded.target_run
    except AttributeError:
        pass

    result = ThreadPool(count).map_async(target_run, range(count))

    try:
        while True:
            item = (yield)
            messages.put(item)
    except GeneratorExit:
        # allow all threads to quit
        # by making sure all of them receives the exit message
        for i in xrange(count):
            messages.put(GeneratorExit)

    result.ready()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM