线程池和对象的线程问题

时间:2018-12-04 22:46:32

标签: python threadpool

使用物体和踏板时出现问题。 下面是该代码的简化示例。

我正在使用线程池循环作业列表。

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结构,该struct被循环以更新输入对象的内容。

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 :(得分:0)

@torek发现,这似乎是“可变默认参数”的情况。

“Least Astonishment” and the Mutable Default Argument