Потоковая проблема с пулом потоков и объектами - PullRequest
0 голосов
/ 05 декабря 2018

У меня проблема при использовании объектов и протекторов.Ниже приведен упрощенный пример кода.

Я использую пул потоков для зацикливания списка заданий.

class File(object):
    def __init__(self, name, streams = [])
        self.name = name
        self.streams = streams

    def appendStream(stream):
        self.streams.append(stream)

class Job(object):
    def __init__(self, file):
        self.file = file

def main():
    ...
    jobs = []

    for f in input_files:
        f_obj = File(f)
        jobs.append(Job(f_obj))

    with ThreadPool(processes = 2, initializer = init, initargs = (log, p_lock)) as pool:
        pool.map(func = process_job, iterable = jobs, chunksize = 1)
    ...

Функция (process_job), используемая пулом потоков, находится в том же файле .py.

def process_job(job):
    ...
    get_info(job.file)
    ...

Эта функция, в свою очередь, использует функцию (get_info) из самоопределяемого пакета.Эта функция создает список аргументов и затем вызывает subprocess.check_output ().Подпроцесс возвращает структуру json, которая зацикливается для обновления содержимого входного объекта.

def get_info(file):
    ...
    args = ["ffprobe", ..., "-i", file.name]
    try:
        output = subprocess.check_output(args)
    except Exception as e:
        print(e)

    data = info_json.decode('utf8')
    json_data = json.loads(data)

    for item in info_json:
        file.appendStream(item["stream"])
    ...

Проблема в том, что при запуске этого кода потоки, порожденные пулом, обновляют файловые объекты друг друга.Например, при запуске этого с 5 входными файлами 5-й файл job.file.streams будет содержать 5 потоков, то есть 4 предыдущих потока, которые принадлежат другим файлам.Почему это происходит и как я могу это решить.

С уважением!

1 Ответ

0 голосов
/ 05 декабря 2018

Как заметил @torek, похоже, что это случай "изменяемого аргумента по умолчанию".

"Наименьшее изумление" и изменяемый аргумент по умолчанию

...