Maison développement back-end tutoriel php Pratique de développement de coroutine asynchrone : optimisation de la vitesse de téléchargement et de téléchargement de fichiers volumineux

Pratique de développement de coroutine asynchrone : optimisation de la vitesse de téléchargement et de téléchargement de fichiers volumineux

Dec 17, 2023 pm 12:50 PM
协程 异步编程 Optimisation du chargement et du téléchargement

Pratique de développement de coroutine asynchrone : optimisation de la vitesse de téléchargement et de téléchargement de fichiers volumineux

Pratique de développement de coroutines asynchrones : optimiser la vitesse de téléchargement et de téléchargement de fichiers volumineux

Avec le développement et la popularisation d'Internet, la transmission de fichiers est devenue la norme. Mais lorsque les fichiers transférés deviennent de plus en plus volumineux, les méthodes traditionnelles de téléchargement et de téléchargement de fichiers rencontreront de nombreuses difficultés. Afin d'optimiser la vitesse de transmission des fichiers volumineux et d'améliorer l'expérience utilisateur, nous pouvons l'implémenter via des coroutines asynchrones. Cet article explique comment utiliser la technologie de coroutine asynchrone pour optimiser la vitesse de téléchargement de fichiers volumineux et fournit des exemples de code spécifiques.

1. Introduction à la technologie de la coroutine asynchrone

La coroutine asynchrone est essentiellement un modèle de programmation. Sa caractéristique est que lorsqu'un blocage se produit, il peut immédiatement libérer le contrôle du thread actuel, confier le contrôle à d'autres tâches pour continuer l'exécution et attendre la fin du blocage avant de revenir à l'exécution, réalisant ainsi la commutation entre plusieurs tâches pour réaliser meilleurs résultats. Effet de traitement efficace.

Les technologies de coroutine asynchrone courantes incluent asyncio en Python, Callback et Promise dans Node.js, etc. Différents langages et technologies peuvent avoir des méthodes de mise en œuvre différentes, mais elles sont essentiellement toutes conçues pour mieux utiliser les ressources informatiques afin d'améliorer la concurrence et l'efficacité du traitement.

2. Optimisez la vitesse des téléchargements de fichiers volumineux

  1. Lors de l'utilisation du téléchargement fragmenté

Lors du téléchargement de fichiers volumineux, le transfert de l'intégralité du fichier vers le serveur en une seule fois entraînera inévitablement une congestion du réseau et des vitesses de transmission lentes. Pour éviter ce problème, les fichiers volumineux peuvent être téléchargés en plusieurs morceaux. Chaque morceau est un paquet de données indépendant et peut être téléchargé en parallèle pour accélérer le téléchargement.

Grâce à la technologie de coroutine asynchrone, vous pouvez facilement mettre en œuvre des téléchargements fragmentés et transmettre plusieurs morceaux de données en parallèle pour obtenir des opérations de téléchargement plus efficaces. Ce qui suit est l’implémentation spécifique du code.

import aiohttp
import asyncio

async def upload_chunk(session, url, file, offset, size):
    headers = {'Content-Length': str(size), 'Content-Range': f'bytes {offset}-{offset+size-1}/{file_size}'}
    data = file.read(size)
    async with session.put(url, headers=headers, data=data) as resp:
        return await resp.json()

async def upload_file_with_chunks(session, url, file):
    file_size = os.path.getsize(file.name)
    chunk_size = 1024 * 1024 * 5 #每块数据的大小为5MB
    offset = 0
    tasks = []
    while offset < file_size:
        size = chunk_size if offset+chunk_size < file_size else file_size-offset
        tasks.append(upload_chunk(session, url, file, offset, size))
        offset += size
    return await asyncio.gather(*tasks)

async def main():
    async with aiohttp.ClientSession() as session:
        url = 'http://example.com/upload'
        file = open('large_file.mp4', 'rb')
        result = await upload_file_with_chunks(session, url, file)
        print(result)

asyncio.run(main())
Copier après la connexion

Dans ce code, nous divisons l'intégralité du fichier en blocs de données d'une taille de 5 Mo, puis utilisons la méthode asyncio.gather() pour exécuter simultanément les tâches de téléchargement de chaque bloc de données pour accélérer augmenter la vitesse de téléchargement. L'idée du téléchargement fragmenté s'applique également au téléchargement de fichiers. Veuillez consulter la section suivante pour plus de détails. asyncio.gather()方法将上传各个数据块的任务并发执行,以加快上传速度。分块上传的思路也同样适用于文件下载,具体请看下一节内容。

  1. 多线程上传

除了使用分块上传,还可以使用多线程的方式来实现大文件的上传操作。使用多线程可以更充分地利用计算机的多核资源,从而加速文件上传的速度。下面是具体的代码实现。

import threading
import requests

class MultiPartUpload(object):
    def __init__(self, url, file_path, num_thread=4):
        self.url = url
        self.file_path = file_path
        self.num_thread = num_thread
        self.file_size = os.path.getsize(self.file_path)
        self.chunk_size = self.file_size//num_thread
        self.threads = []
        self.lock = threading.Lock()

    def upload(self, i):
        start = i * self.chunk_size
        end = start + self.chunk_size - 1
        headers = {"Content-Range": "bytes %s-%s/%s" % (start, end, self.file_size),
                   "Content-Length": str(self.chunk_size)}
        data = open(self.file_path, 'rb')
        data.seek(start)
        resp = requests.put(self.url, headers=headers, data=data.read(self.chunk_size))
        self.lock.acquire()
        print("Part %d status: %s" % (i, resp.status_code))
        self.lock.release()

    def run(self):
        for i in range(self.num_thread):
            t = threading.Thread(target=self.upload, args=(i,))
            self.threads.append(t)
        for t in self.threads:
            t.start()

        for t in self.threads:
            t.join()

if __name__ == '__main__':
    url = 'http://example.com/upload'
    file = 'large_file.mp4'
    uploader = MultiPartUpload(url, file)
    uploader.run()
Copier après la connexion

在这段代码中,我们使用了Python标准库中的threading模块来实现多线程上传。将整个文件分成多个数据块,每个线程负责上传其中的一块,从而实现并发上传。使用锁机制来保护并发上传过程中的线程安全。

三、优化大文件下载的速度

除了上传,下载大文件同样是一个很常见的需求,同样可以通过异步协程来实现优化。

  1. 分块下载

和分块上传类似,分块下载将整个文件划分成若干块,每一块独立下载,并行传输多个块数据,从而加快下载速度。具体的代码实现如下:

import aiohttp
import asyncio
import os

async def download_chunk(session, url, file, offset, size):
    headers = {'Range': f'bytes={offset}-{offset+size-1}'}
    async with session.get(url, headers=headers) as resp:
        data = await resp.read()
        file.seek(offset)
        file.write(data)
        return len(data)

async def download_file_with_chunks(session, url, file):
    async with session.head(url) as resp:
        file_size = int(resp.headers.get('Content-Length'))
        chunk_size = 1024 * 1024 * 5 #每块数据的大小为5MB
        offset = 0
        tasks = []
        while offset < file_size:
            size = chunk_size if offset+chunk_size < file_size else file_size-offset
            tasks.append(download_chunk(session, url, file, offset, size))
            offset += size
        return await asyncio.gather(*tasks)

async def main():
    async with aiohttp.ClientSession() as session:
        url = 'http://example.com/download/large_file.mp4'
        file = open('large_file.mp4', 'wb+')
        await download_file_with_chunks(session, url, file)

asyncio.run(main())
Copier après la connexion

在这段代码中,我们使用了aiohttp库来进行异步协程的并行下载。同样地,将整个文件分成大小为5MB的数据块,然后使用asyncio.gather()方法将下载各个数据块的任务并发执行,加快文件下载速度。

  1. 多线程下载

除了分块下载,还可以使用多线程下载的方式来实现大文件的下载操作。具体的代码实现如下:

import threading
import requests

class MultiPartDownload(object):
    def __init__(self, url, file_path, num_thread=4):
        self.url = url
        self.file_path = file_path
        self.num_thread = num_thread
        self.file_size = requests.get(self.url, stream=True).headers.get('Content-Length')
        self.chunk_size = int(self.file_size) // self.num_thread
        self.threads = []
        self.lock = threading.Lock()

    def download(self, i):
        start = i * self.chunk_size
        end = start + self.chunk_size - 1 if i != self.num_thread - 1 else ''
        headers = {"Range": "bytes=%s-%s" % (start, end)}
        data = requests.get(self.url, headers=headers, stream=True)
        with open(self.file_path, 'rb+') as f:
            f.seek(start)
            f.write(data.content)
        self.lock.acquire()
        print("Part %d Downloaded." % i)
        self.lock.release()

    def run(self):
        for i in range(self.num_thread):
            t = threading.Thread(target=self.download, args=(i,))
            self.threads.append(t)
        for t in self.threads:
            t.start()

        for t in self.threads:
            t.join()

if __name__ == '__main__':
    url = 'http://example.com/download/large_file.mp4'
    file = 'large_file.mp4'
    downloader = MultiPartDownload(url, file)
    downloader.run()
Copier après la connexion

在这段代码中,我们同样使用了Python标准库中的threading

    Téléchargement multithread

    En plus d'utiliser le téléchargement fragmenté, vous pouvez également utiliser le multithread pour télécharger des fichiers volumineux. L'utilisation du multithreading peut permettre une utilisation plus complète des ressources multicœurs de votre ordinateur, accélérant ainsi le téléchargement de fichiers. Ce qui suit est l’implémentation spécifique du code.

    rrreee🎜Dans ce code, nous utilisons le module threading de la bibliothèque standard Python pour implémenter le téléchargement multi-thread. Divisez l'intégralité du fichier en plusieurs blocs de données et chaque thread est responsable du téléchargement de l'un d'entre eux, réalisant ainsi des téléchargements simultanés. Utilisez un mécanisme de verrouillage pour protéger la sécurité des threads lors des téléchargements simultanés. 🎜🎜3. Optimiser la vitesse de téléchargement de fichiers volumineux🎜🎜En plus du téléchargement, le téléchargement de fichiers volumineux est également une exigence très courante, et l'optimisation peut également être réalisée grâce à des coroutines asynchrones. 🎜🎜🎜Téléchargement groupé🎜🎜🎜Semblable au téléchargement fragmenté, le téléchargement fragmenté divise l'intégralité du fichier en plusieurs morceaux, chaque morceau est téléchargé indépendamment et plusieurs morceaux de données sont transférés en parallèle pour accélérer le téléchargement. L'implémentation spécifique du code est la suivante : 🎜rrreee🎜Dans ce code, nous utilisons la bibliothèque aiohttp pour effectuer des téléchargements parallèles de coroutines asynchrones. De même, divisez l'intégralité du fichier en blocs de données de 5 Mo, puis utilisez la méthode asyncio.gather() pour exécuter simultanément les tâches de téléchargement de chaque bloc de données afin d'accélérer le téléchargement du fichier. 🎜
      🎜Téléchargement multithread🎜🎜🎜En plus du téléchargement par morceaux, vous pouvez également utiliser le téléchargement multithread pour télécharger des fichiers volumineux. L'implémentation spécifique du code est la suivante : 🎜rrreee🎜Dans ce code, nous utilisons également le module threading de la bibliothèque standard Python pour implémenter le téléchargement multithread. L'ensemble du fichier est divisé en plusieurs blocs de données et chaque thread est responsable du téléchargement de l'un des blocs, réalisant ainsi un téléchargement simultané. Le mécanisme de verrouillage est également utilisé pour protéger la sécurité des threads lors de téléchargements simultanés. 🎜🎜4. Résumé🎜🎜Cet article explique comment utiliser la technologie de coroutine asynchrone pour optimiser la vitesse de téléchargement de fichiers volumineux. En bloquant et en traitant en parallèle les opérations de téléchargement et de téléchargement, l'efficacité du transfert de fichiers peut être rapidement améliorée. Que ce soit dans les coroutines asynchrones, le multi-threading, les systèmes distribués et d'autres domaines, il a un large éventail d'applications. J'espère que cet article vous aidera ! 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La relation parent-enfant entre les fonctions golang et goroutine La relation parent-enfant entre les fonctions golang et goroutine Apr 25, 2024 pm 12:57 PM

Il existe une relation parent-enfant entre les fonctions et les goroutines dans Go. La goroutine parent crée la goroutine enfant, et la goroutine enfant peut accéder aux variables de la goroutine parent mais pas l'inverse. Créez une goroutine enfant à l'aide du mot-clé go, et la goroutine enfant est exécutée via une fonction anonyme ou une fonction nommée. La goroutine parent peut attendre que la goroutine enfant se termine via sync.WaitGroup pour s'assurer que le programme ne se termine pas avant que toutes les goroutines enfants ne soient terminées.

Comment implémenter la programmation asynchrone avec les fonctions C++ ? Comment implémenter la programmation asynchrone avec les fonctions C++ ? Apr 27, 2024 pm 09:09 PM

Résumé : La programmation asynchrone en C++ permet d'effectuer plusieurs tâches sans attendre des opérations fastidieuses. Utilisez des pointeurs de fonction pour créer des pointeurs vers des fonctions. La fonction de rappel est appelée lorsque l'opération asynchrone est terminée. Les bibliothèques telles que boost::asio fournissent un support de programmation asynchrone. Le cas pratique montre comment utiliser les pointeurs de fonction et boost::asio pour implémenter des requêtes réseau asynchrones.

Application de la concurrence et des coroutines dans la conception de l'API Golang Application de la concurrence et des coroutines dans la conception de l'API Golang May 07, 2024 pm 06:51 PM

La concurrence et les coroutines sont utilisées dans la conception GoAPI pour : Traitement hautes performances : traiter plusieurs requêtes simultanément pour améliorer les performances. Traitement asynchrone : utilisez des coroutines pour traiter des tâches (telles que l'envoi d'e-mails) de manière asynchrone, libérant ainsi le thread principal. Traitement des flux : utilisez des coroutines pour traiter efficacement les flux de données (tels que les lectures de bases de données).

La relation entre la coroutine Golang et la goroutine La relation entre la coroutine Golang et la goroutine Apr 15, 2024 am 10:42 AM

Coroutine est un concept abstrait permettant d'exécuter des tâches simultanément, et goroutine est une fonction de thread légère dans le langage Go qui implémente le concept de coroutine. Les deux sont étroitement liés, mais la consommation des ressources des goroutines est moindre et gérée par le planificateur Go. Goroutine est largement utilisé dans les combats réels, comme le traitement simultané des requêtes Web et l'amélioration des performances des programmes.

Comment contrôler le cycle de vie des coroutines Golang ? Comment contrôler le cycle de vie des coroutines Golang ? May 31, 2024 pm 06:05 PM

Le cycle de vie de la coroutine Go peut être contrôlé des manières suivantes : Créer une coroutine : utilisez le mot-clé go pour démarrer une nouvelle tâche. Terminez les coroutines : attendez que toutes les coroutines soient terminées, utilisez sync.WaitGroup. Utilisez les signaux de fermeture de canal. Utilisez le contexte context.Context.

Problèmes courants et solutions dans la programmation asynchrone dans le framework Java Problèmes courants et solutions dans la programmation asynchrone dans le framework Java Jun 04, 2024 pm 05:09 PM

3 problèmes et solutions courants dans la programmation asynchrone dans les frameworks Java : Callback Hell : utilisez Promise ou CompletableFuture pour gérer les rappels dans un style plus intuitif. Conflit de ressources : utilisez des primitives de synchronisation (telles que des verrous) pour protéger les ressources partagées et envisagez d'utiliser des collections thread-safe (telles que ConcurrentHashMap). Exceptions non gérées : gérez explicitement les exceptions dans les tâches et utilisez un cadre de gestion des exceptions (tel que CompletableFuture.exceptionally()) pour gérer les exceptions.

Comment le framework Golang gère-t-il la concurrence et la programmation asynchrone ? Comment le framework Golang gère-t-il la concurrence et la programmation asynchrone ? Jun 02, 2024 pm 07:49 PM

Le framework Go utilise les fonctionnalités de concurrence et asynchrones de Go pour fournir un mécanisme permettant de gérer efficacement les tâches simultanées et asynchrones : 1. La concurrence est obtenue via Goroutine, permettant d'exécuter plusieurs tâches en même temps. 2. La programmation asynchrone est implémentée via des canaux, qui peut être exécuté sans bloquer le thread principal;3. Convient aux scénarios pratiques, tels que le traitement simultané des requêtes HTTP, l'acquisition asynchrone des données de base de données, etc.

Quels sont les avantages et les inconvénients de la programmation asynchrone en PHP ? Quels sont les avantages et les inconvénients de la programmation asynchrone en PHP ? May 06, 2024 pm 10:00 PM

Les avantages de la programmation asynchrone en PHP incluent un débit plus élevé, une latence plus faible, une meilleure utilisation des ressources et une évolutivité. Les inconvénients incluent la complexité, la difficulté de débogage et la prise en charge limitée des bibliothèques. Dans le cas réel, ReactPHP est utilisé pour gérer les connexions WebSocket, démontrant l'application pratique de la programmation asynchrone.

See all articles