【问题标题】:my python async script does not process requests quickly?我的 python 异步脚本不能快速处理请求?
【发布时间】:2022-01-14 00:17:23
【问题描述】:

我开发了一个 Python 脚本,允许(理论上)将 WAV 文件转换为 MP3 文件。我正在尝试使其 ASYNC (asyncio) 同时转换多个文件并减少处理时间。

但我转换 1 或 10 所花费的时间和相同。我还不太擅长使用异步


class SoundsProcessing:

  

    async def cconvert(self, sem, audioFileIndex, audioFile, aOutputFormat = 'mp3'):
        try:
            async with sem:

                inputfile = tempfile.NamedTemporaryFile()
                inputfile.write(audioFile)
                outputfile = tempfile.NamedTemporaryFile()


                AudioSegment.from_wav(inputfile.name).export(outputfile.name+'.'+aOutputFormat, format=aOutputFormat)

                inputfile.close()

                audio = await readAsyncFile(outputfile.name+'.'+aOutputFormat)

                self.audioFiles[audioFileIndex] = audio

                outputfile.close()

                logger.add('INFO', "Audio Files conversion: " + outputfile.name + " indexed " + str(audioFileIndex) + " is Done")

                return audio

        except Exception as e:
            logger.add('WARNING', "Audio Files conversion: " + str(e))
            return False

    async def audioConversion(self, aOutputAudioFormat = 'mp3'):

        tasks = []
        sem = asyncio.Semaphore(10)
        start_at = time.time()

        logger.add('INFO', "Audio Files conversion: Start session for " + str(len(self.audioFiles)) + " files/treatment")

        audioFileIndex = 0
        for audioFile in self.audioFiles:
            task = asyncio.ensure_future(self.cconvert(sem, audioFileIndex, audioFile, aOutputAudioFormat))
            tasks.append(task)
            audioFileIndex = audioFileIndex + 1

        responses = asyncio.gather(*tasks)
        await responses

        time_lapse = round(time.time() - start_at, 2)
        query_by_seconds = round(len(self.audioFiles) / time_lapse, 2)
        logger.add('INFO', "Audio Files conversion: End session on " + str(time_lapse) + " seconds ("+str(query_by_seconds)+"q/s)")


    def convert(self, aOutputAudioFormat = 'mp3'):
        self.results = {}

        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        future = asyncio.ensure_future(self.audioConversion(aOutputAudioFormat))
        loop.run_until_complete(future)

【问题讨论】:

    标签: python-3.x async-await python-asyncio


    【解决方案1】:

    您可以将代码正确地重写为“异步”——乍一看还可以——但它不会更快:这是一个 CPU 绑定任务——也就是说,该过程需要时间在 .from_wav称呼。 asyncio 循环将被阻塞,而不会返回。

    你可以试试,如果你有一个多核机器是写你的cconvert方法的主体,在同步方法中with sem: 块内的部分(忘记异步文件访问),然后运行在 ProcessPollExecutor 中,使用 loop.run_in_executor 调用,传入显式的 concurrent.futures.ProcessPoolExecutor 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多