2015-01-07 4 views
0

Могу ли я запускать несколько потоков, работающих с теми же копиями сопрограммы?Несколько потоков с той же сопрограммой?

, например, если изменить функцию резьбовой от этого tutorial к

@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) 

ли это на самом деле работает? Как проверить, работает ли он?

ответ

0

Я думаю, что я получил это фиксировано, мне нужно, чтобы изменить функцию, чтобы что-то подобное для того, чтобы работать

@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() 
Смежные вопросы