【发布时间】: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