Dans la programmation asynchrone, il est souvent nécessaire de limiter le nombre de tâches simultanées pouvant être exécutées à un moment donné pour obtenir une limitation. Ceci est particulièrement utile lors de plusieurs appels d’API ou du traitement de grands ensembles de données.
La méthode d'extension ThrottleTasksAsync fournie résout cette situation. Il accepte une énumération de projets, un nombre maximum de tâches simultanées et une fonction de création de tâches. Il utilise BlockingCollection et SemaphoreSlim pour appliquer la limitation.
<code class="language-c#">public static async Task<result_t> ThrottleTasksAsync<enumerable_t, result_t>( this IEnumerable<enumerable_t> enumerable, int maxConcurrentTasks, int maxDegreeOfParallelism, Func<enumerable_t, Task> taskToRun) { // ... }</code>
Cette méthode exécute le throttle sur un thread séparé, en utilisant SemaphoreSlim pour contrôler le nombre de tâches simultanées. Il utilise également Parallel.ForEach pour réaliser la parallélisation, dans un degré de parallélisme spécifié.
Bien que la méthode ThrottleTasksAsync fournisse une solution, le flux de données TPL propose une approche plus élégante. Plus précisément, les classes TransformBlock
<code class="language-c#">var downloader = new TransformBlock<string, HttpResponse>( url => Download(url), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 }); var buffer = new BufferBlock<HttpResponse>(); downloader.LinkTo(buffer);</code>
En liant un TransformBlock à un BufferBlock, l'achèvement du bloc n'est pas bloqué par la disponibilité du consommateur. Cela permet au fragment de tampon de collecter les objets HttpResponse lors de sa génération, et le programme peut attendre la fin du téléchargeur avant de traiter la réponse.
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!