【问题标题】:Python multithreading takes longer to execute the multiple jar filesPython多线程执行多个jar文件需要更长的时间
【发布时间】: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


    【解决方案1】:

    使用多线程并不一定意味着它会执行得更快。您必须处理 Python 的 GIL 才能执行命令。想象一下,1 人可以比 1 人同时完成 2 项任务更快地完成 1 项任务。他/她必须先执行多任务并执行部分线程 1,然后切换到线程 2,等等。线程越多,python 解释器要做的事情就越多。

    同样的事情也可能发生在 Java 上。我不使用Java,但他们可能有同样的问题。在这里,Is Java a Compiled or an Interpreted programming language ? 表示 JVM 即时转换 Java,因此 JVM 可能必须处理与 Python 相同的问题。

    而且,对于time.sleep(8),它所做的只是消耗线程的处理器时间,因此很容易在一堆等待任务之间切换。

    【讨论】:

      猜你喜欢
      • 2010-10-18
      • 2023-03-23
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多