Параллельная запись в список в 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

Мне не нравится этот подход, поскольку он имеет:

  1. Общая глобальная переменная -> Как бы иметь локальную переменную для функции `total_results?
  2. То, как я проверяю, когда возвращается список, кажется несколько неуклюжим, какой будет стандартный способ?

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.

Другие вопросы по тегам