函数中增加了head请求,来判断url是否可以正常使用,导致函数执行时间比较长,如何进行优化

def task_detail(device_type):
    data = {"task": []}
    taskmasters = TaskMastersService.get_group(device_type=device_type)

    data["taskmasters_id"] = taskmasters[1]
    sample_task = {}
    sample_id = []
    for task in taskmasters[0]:
        sample_task[task.sample_id] = task.id

        if task.sample_id not in sample_id:
            sample_id.append(task.sample_id)

    sample_data = SampleService.get_sample(sample_id=sample_id)

    for sample in sample_data:
        dic = {}
        tp_pcm_url = sample.audio_url
        tp_pcm_url = tp_pcm_url.strip('mp3') + 'pcm'

        note_range = sample.note_range
        start_index = note_range.split(',')[0]
        end_index = note_range.split(',')[1]

        score_url = sample.score.ai_file_path

        dic["id"] = sample_task[sample.id]
        dic["sample_id"] = sample.id
        dic["score_url"] = score_url
        dic["tp_pcm_url"] = tp_pcm_url
        dic["start_index"] = start_index
        dic["end_index"] = end_index

        # resp = requests.head(url=tp_pcm_url)

        # if resp.status_code == 200:
        data["task"].append(dic)
        # else:
        #     continue

    return data

加上注释掉的代码,函数执行就变慢很多。
希望达到效果:即判断了url是否可用,又不会导致函数执行很慢

Jason990420
最佳答案
resp = requests.head(url=tp_pcm_url)

URL 请求挺占时间的, 即使只要求header 或status code. 单个请求基本上无法由代码来加速, 所以能加速的部份就是针对多个请求, 一般的作法都是使用多线程, 如threading , multiprocessing, concurrent, subprocess, _thread 等方法.

3年前 评论
讨论数量: 1
Jason990420
resp = requests.head(url=tp_pcm_url)

URL 请求挺占时间的, 即使只要求header 或status code. 单个请求基本上无法由代码来加速, 所以能加速的部份就是针对多个请求, 一般的作法都是使用多线程, 如threading , multiprocessing, concurrent, subprocess, _thread 等方法.

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!