簡體   English   中英

Python多線程執行更長的時間來執行多個jar文件

[英]Python multithreading takes longer to execute the multiple jar files

我正在使用ThreadPoolExecutor並將完全相同的任務交給工作人員。 任務是運行一個jar文件並對其進行處理。 我面臨的問題與時間有關。

情況1:我向池提交了一項任務,工作人員在8秒內完成。

情況2:我兩次向池提交相同的任務,並且兩名工作人員都完成了大約10.50秒。

情況3:我將同一任務三次提交到池中,並且所有三名工人都在大約13.38秒左右完成。

案例4:我將同一任務提交了4次到池中,所有前工大約在18.88秒左右完成。

如果我將worker任務替換為time.sleep(8) (而不是運行jar文件),則所有4個worker都會在約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'])

使用多線程並不一定意味着它將執行得更快。 您必須處理用於Python的GIL才能執行命令。 認為1個人比1個人同時執行2個任務快1個任務。 他/她將必須執行多任務並首先執行線程1的一部分,而不是切換到線程2,依此類推。線程越多,python解釋器要做的事情就越多。

Java也可能發生同樣的事情。 我不使用Java,但它們可能有相同的問題。 Java是編譯語言還是解釋性編程語言? 它說JVM可以即時轉換Java,因此JVM可能必須處理與Python相同的問題。

而且,對於time.sleep(8) ,它所做的只是耗盡線程的處理器時間,因此在一系列等待的任務之間進行切換很容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM