2014-11-01 2 views
1

Я новичок в потоковом я имею существующее приложение, которое я хотел бы сделать немного быстрее, используя потоки.Python threading возвращает значения

У меня есть несколько функций, которые возвращаются к основному диктову и хотели бы отправить их отдельным потокам, чтобы они запускались одновременно, а не по одному за раз.

Я немного поработал с поиском, но я не могу найти что-то, что соответствует моему существующему коду и может немного помочь.

У меня есть около шести функций, которые возвращают к главному Словарю, как это:

parsed['cryptomaps'] = pipes.ConfigParse.crypto(parsed['split-config'], parsed['asax'], parsed['names']) 

Проблема здесь заключается с возвращаемым значением. Я понимаю, что мне нужно будет использовать для этого очередь, но мне нужна очередь для каждой из этих шести функций или одна очередь для всех этих. Если это более поздний вариант, как я буду отделять возвращаемые данные от потоков и присваивать правильные записи Dict.

Любая помощь по этому вопросу будет замечательной.

Джон

ответ

1

Вы можете нажать кортежи (уборщица, данные) в очередь, чтобы определить источник. Также обратите внимание, что из-за переполнения Global Interpreter Lock Python не очень полезно. Я предлагаю взглянуть на многопроцессорный модуль, который предлагает интерфейс, очень похожий на многопоточность, но на самом деле масштабируется с количеством рабочих.

Редактировать:

Образец кода.

import multiprocessing as mp 

# py 3 compatibility 
try: 
    from future_builtins import range, map 
except ImportError: 
    pass 


data = [ 
    # input data 
    # {split_config: ... } 
] 

def crypto(split_config, asax, names): 
    # your code here 
    pass 

if __name__ == "__main__": 
    terminate = mp.Event() 
    input = mp.Queue() 
    output = mp.Queue() 


    def worker(id, terminate, input, output): 
     # use event here to graciously exit 
     # using Process.terminate would leave queues 
     # in undefined state 
     while not terminate.is_set(): 
      try: 
       x = input.get(True, timeout=1000) 
       output.put((id, crypto(**x))) 
      except Queue.Empty: 
       pass 

    workers = [mp.Process(target=worker, args=(i,)) for i in range(0, mp.cpu_count())] 
    for worker in workers: 
     worker.start() 

    for x in data: 
     input.put(x) 

    # terminate workers 
    terminate.set() 

    # process results 
    # make sure that queues are emptied otherwise Process.join can deadlock 

    for worker in workers: 
     worker.join()