线程池和对象的线程问题
Threading problem with threadpool and objects
我在使用对象和踏板时遇到问题。
下面是代码的简化示例。
我正在使用线程池来遍历作业列表。
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()。
子进程 returns 一个 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 个流。
为什么会发生这种情况,我该如何解决。
此致!
正如@torek 所发现的,这似乎是 "Mutable Default Argument".
的一个例子
“Least Astonishment” and the Mutable Default Argument
我在使用对象和踏板时遇到问题。 下面是代码的简化示例。
我正在使用线程池来遍历作业列表。
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()。 子进程 returns 一个 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 个流。 为什么会发生这种情况,我该如何解决。
此致!
正如@torek 所发现的,这似乎是 "Mutable Default Argument".
的一个例子“Least Astonishment” and the Mutable Default Argument