2015-10-15 4 views
0

У меня есть функция slow_function, которая занимает около 200 секунд для обработки job_title, она читает и записывает в/из глобальной переменной.Запуск функции параллельно с разными аргументами - python

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

код работает пять категорий рабочих мест параллельно:

from threading import Thread 
    threads = [] 

    start = time.time() 
    for job_title in self.job_titles: 
     t = Thread(target=self.slow_function, args=(job_title,)) 
     threads.append(t) 
    # Start all threads 
    for x in threads: 
     x.start() 

    # Wait for all of them to finish 
    for x in threads: 
     x.join() 
    end = time.time() 
    print "New time taken for all jobs:", end - start 
+0

Пожалуйста, прочтите этот http://stackoverflow.com/questions/32657840/is-it-possible-to-avoid-locking-overhead-when-sharing- dicts-между-нитей-в-р/32659672 # 32659672. Я не уверен, что ваш вопрос дублирован или нет, но это может вам помочь. – Jimilian

+0

Спасибо. Ваше решение сработало для меня. – Azhar

ответ

0

Вы должны извлечь функцию slow_function из метода класса, поскольку невозможно разделить локальный контекст между процессами. И после этого вы можете использовать этот код:

from multiprocessing import Pool 

start = time.time() 

pool = Pool() 

results = pool.map(slow_function, self.job_titles) 

for r in results: 
    # update your `global` variables here 

end = time.time() 
print "New time taken for all jobs:", end - start 
0

Вы должны использовать мультипроцессирование модуля (https://docs.python.org/2/library/multiprocessing.html), так как модуль нарезания резьбы ограничиваются GIL (https://docs.python.org/2/glossary.html#term-global-interpreter-lock).

Но вы не можете использовать глобальные переменные для обмена данными между порожденными процессами !!! ... см. https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes

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