Параллельная запись в список в Python
Я получил несколько параллельных процессов записи в один список в Python. Мой код:
global_list = []
class MyThread(threading.Thread):
...
def run(self):
results = self.calculate_results()
global_list.extend(results)
def total_results():
for param in params:
t = MyThread(param)
t.start()
while threading.active_count() > 1:
pass
return total_results
Мне не нравится этот подход, поскольку он имеет:
- Общая глобальная переменная -> Как бы иметь локальную переменную для функции `total_results?
- То, как я проверяю, когда возвращается список, кажется несколько неуклюжим, какой будет стандартный способ?
2 ответа
1 - Используйте переменную класса, совместно используемую всеми экземплярами Worker, чтобы добавить свои результаты
class Worker(threading.Thread):
results = []
...
def run(self):
results = self.calculate_results()
Worker.results.extend(results) # extending a list is thread safe
2 - Используйте join(), чтобы дождаться завершения всех потоков и дать им некоторое вычислительное время
def total_results(params):
# create all workers
workers = [Worker(p) for p in params]
# start all workers
[w.start() for w in workers]
# wait for all of them to finish
[w.join() for w in workers]
#get the result
return Worker.results
Ваш компьютер требует значительных ресурсов процессора? Если это так, вы должны взглянуть на многопроцессорный модуль, который включен в Python и предлагает довольно простой в использовании класс Pool, в который вы можете вводить вычислительные задачи, а затем получать все результаты. Если вам нужно много процессорного времени, это все равно будет быстрее, потому что Python не очень хорошо работает с потоками: только один поток интерпретатора может одновременно выполняться в одном процессе. Многопроцессорность обходит это (и предлагает абстракцию пула, которая облегчает вашу работу). Да, и если вы действительно хотите придерживаться потоков, многопроцессорность также имеет ThreadPool.