2015-09-28 4 views
0
for x,y in my_dict.iteritems(): 
    for z in y: 
      def done_callback(result): 

       code,content=result.get() 
       if code==0: 
         if content: 
          new_content.append(content) 
         else: 
          pass 
       else: 
         return error_html(environ,start_response,content) 


      try: 
        pool.apply_async(function_returns_tuple,(x,z,my_val),done_callback) 
      except Exception as e: 
        print e 

Когда я вижу значение new_content, он пуст, а также функция обратного вызова - done_callback не вызван. Я упускаю какую-то часть?Обратный звонок не набирается

+0

«Когда я вижу значение new_content» никогда не отображается в коде, и это относится к вопросу. Но это похоже на типичную проблему асинхронности. Помните - любые результаты async должны быть доступны только из обратного вызова (или где-либо, где обратный вызов находится в трассировке стека). Вам может потребоваться использовать 'concurrent.futures.ThreadPoolExecutor' для управления async для вас. – Amadan

+0

new_content - это список, который я проверяю вне всего этого, вне всех циклов for. – user3089927

+0

Тогда, как я и предсказывал. Скажем, у вас четверо детей; вы говорите им: «Мне нужно идти на работу, но мой телефон отсутствует, поэтому все ищут и дают его мне, когда вы его найдете!» а затем, вместо того, чтобы ждать, * вы идете на работу сразу *. Один из ваших детей находит телефон, затем пытается отдать его вам, но вас больше нет. Между тем, вы на работе, без разговора, удивляясь, почему дети так ленивы в эти дни. – Amadan

ответ

0

Вот рабочий минимальный пример:

from multiprocessing import Pool 
from time import sleep 

my_dict = { "a": [1, 2], "b": [3] } 
my_val = 5 

# has to be defined before Pool is created 
def processing_function(args): 
    (x, y, v) = args  # mapped function only gets one arg; so we unpack 
    if y == 2:   # we throw a wrinkle in, 
     return ('', '') # to demonstrate filter 
    return ("[Code %s %d %d]" % (x, y, v), "[Content %s %d %d]" % (x, y, v)) 


pool = Pool(2) # execute two workers in parallel (feel free to change) 

# make an iterator for all your values 
inputs = ((x, z, my_val) for (x, y) in my_dict.iteritems() for z in y) 
async_results = pool.map_async(processing_function, inputs) 
pool.close()  # necessary before pool.join() 
pool.join()  # wait for all processes in the pool to finish 
results = async_results.get() # now we can get the results 
# we can extract just the results we want... 
non_empty_content_joined = ''.join(
     content for (code, content) in results if content != '') 
print non_empty_content_joined 
# => [Content a 1 5][Content b 3 5] 
+0

Спасибо за пример, но какая часть отсутствует в моей части кода. Не могли бы вы указать на дыры в моей отрывке? – user3089927

+0

'join()' будет ждать результатов в основном потоке, если они вам понадобятся в основном потоке. – Amadan

0

При указании функции обратного вызова в apply_async, обратный вызов будет вызван через некоторое время. «Асинхронная» часть означает, что вы можете продолжать работу в своем текущем потоке до завершения задания .

В вашем примере кода вы вызываете apply_async в цикле, но затем вы не ожидаете завершения каких-либо операций. Вам нужно будет поддерживать основной поток (например, путем блокировки или циклирования), если вы хотите дождаться завершения операций.

Смежные вопросы