【发布时间】:2019-11-27 16:46:26
【问题描述】:
我正在使用 ThreadPoolExecutor 并向工作人员提供完全相同的任务。任务是运行一个 jar 文件并对其进行处理。我面临的问题与时间有关。
案例 1:我向池中提交了一项任务,工人在 8 秒内完成。
案例 2:我向池中提交了两次相同的任务,两个工人都完成了大约 10.50 秒。
案例 3:我向池中提交了三次相同的任务,所有三个工人都完成了大约 13.38 秒。
案例 4:我向池中提交了 4 次相同的任务,所有前级工作人员大约完成了约 18.88 秒。
如果我将工作人员任务替换为time.sleep(8)(而不是运行 jar 文件),那么所有 4 名工作人员都将在大约 8 秒内完成。是不是因为操作系统在执行java代码之前必须先创建java环境,操作系统无法并行管理?
有人可以解释一下为什么并行运行时同一任务的执行时间会增加吗?谢谢 :)
这是我执行池的方式;
def transfer_files(file_name):
raw_file_obj = s3.Object(bucket_name='foo-bucket', key=raw_file_name)
body = raw_file_obj.get()['Body']
# prepare java command
java_cmd = "java -server -ms650M -mx800M -cp {} commandline.CSVExport --sourcenode=true --event={} --mode=human_readable --configdir={}" \
.format(jar_file_path, event_name, config_dir)
# Run decoder_tool by piping in the encoded binary bytes
log.info("Running java decoder tool for file {}".format(file_name))
res = run([java_cmd], cwd=tmp_file_path, shell=True, input=body.read(), stderr=PIPE, stdout=PIPE)
res_output = res.stderr.decode("utf-8")
if res.returncode != 0:
if 'Unknown event' in res_output:
log.error("Exception occurred whilst running decoder tool")
raise Exception("Unknown event {}".format(event_name))
log.info("decoder tool output: \n" + res_output)
with futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as pool:
# add new task(s) into thread pool
pool.map(transfer_file, ['fileA_for_workerA', 'fileB_for_workerB'])
【问题讨论】:
标签: java python multithreading memory time