Comment envoyer 100 000 requêtes http le plus rapidement possible

Somenzz 2021-09-15 04:28:10
comment envoyer requ tes http


S'il y a un fichier,Il y a 10 Dix mille url,Chaque url Envoyer http Demande,Et imprimez le Code d'état du résultat de la demande,Comment écrire le Code pour accomplir ces tâches le plus rapidement possible?

Python Il existe de nombreuses façons de programmer simultanément,Bibliothèque standard multithreadée threading,concurrency,Co - Process asyncio,Bien sûr. grequests Cette bibliothèque asynchrone,Chacune de ces exigences peut être satisfaite,Un par un, mettez - le en Code,Le Code de cet article peut être exécuté directement,Pour vous donner plus tard la programmation simultanée comme référence:

File d'attente+Multithreading

Définir une taille de 400 File d'attente pour,Puis allumez 200 Threads,Chaque thread est constamment extrait de la file d'attente url Et visiter.

Le thread principal lit dans le fichier url Dans la file d'attente,Ensuite, attendez que tous les éléments de la file d'attente soient reçus et traités.Les codes sont les suivants::

from threading import Thread
import sys
from queue import Queue
import requests
concurrent = 200
def doWork():
while True:
url = q.get()
status, url = getStatus(url)
doSomethingWithResult(status, url)
q.task_done()
def getStatus(ourl):
try:
res = requests.get(ourl)
return res.status_code, ourl
except:
return "error", ourl
def doSomethingWithResult(status, url):
print(status, url)
q = Queue(concurrent * 2)
for i in range(concurrent):
t = Thread(target=doWork)
t.daemon = True
t.start()
try:
for url in open("urllist.txt"):
q.put(url.strip())
q.join()
except KeyboardInterrupt:
sys.exit(1)

Les résultats sont les suivants:

Y a - t - il get Aux nouvelles compétences ?

Pool de Threads

Si vous utilisez un pool de Threads , Il est recommandé d'utiliser des concurrent.futures Bibliothèque:

import concurrent.futures
import requests
out = []
CONNECTIONS = 100
TIMEOUT = 5
urls = []
with open("urllist.txt") as reader:
for url in reader:
urls.append(url.strip())
def load_url(url, timeout):
ans = requests.get(url, timeout=timeout)
return ans.status_code
with concurrent.futures.ThreadPoolExecutor(max_workers=CONNECTIONS) as executor:
future_to_url = (executor.submit(load_url, url, TIMEOUT) for url in urls)
for future in concurrent.futures.as_completed(future_to_url):
try:
data = future.result()
except Exception as exc:
data = str(type(exc))
finally:
out.append(data)
print(data)

Co - Process + aiohttp

La co - ingénierie est également un outil très courant pour la concurrence :

import asyncio
from aiohttp import ClientSession, ClientConnectorError
async def fetch_html(url: str, session: ClientSession, **kwargs) -> tuple:
try:
resp = await session.request(method="GET", url=url, **kwargs)
except ClientConnectorError:
return (url, 404)
return (url, resp.status)
async def make_requests(urls: set, **kwargs) -> None:
async with ClientSession() as session:
tasks = []
for url in urls:
tasks.append(
fetch_html(url=url, session=session, **kwargs)
)
results = await asyncio.gather(*tasks)
for result in results:
print(f'{result[1]} - {str(result[0])}')
if __name__ == "__main__":
import sys
assert sys.version_info >= (3, 7), "Script requires Python 3.7+."
with open("urllist.txt") as infile:
urls = set(map(str.strip, infile))
asyncio.run(make_requests(urls=urls))

grequests[1]

C'est une bibliothèque tierce ,Actuellement disponible 3.8K Une étoile. ,C'est Requests + Gevent[2], Laissez asynchrone http La demande devient plus simple .Gevent L'essence de la coopération est .

Avant utilisation:

pip install grequests

C'est assez simple à utiliser :

import grequests
urls = []
with open("urllist.txt") as reader:
for url in reader:
urls.append(url.strip())
rs = (grequests.get(u) for u in urls)
for result in grequests.map(rs):
print(result.status_code, result.url)

Attention! grequests.map(rs) Est exécuté simultanément.Les résultats sont les suivants:

La gestion des exceptions peut également être ajoutée :

>>> def exception_handler(request, exception):
... print("Request failed")
>>> reqs = [
... grequests.get('http://httpbin.org/delay/1', timeout=0.001),
... grequests.get('http://fakedomain/'),
... grequests.get('http://httpbin.org/status/500')]
>>> grequests.map(reqs, exception_handler=exception_handler)
Request failed
Request failed
[None, None, <Response [500]>]

Les derniers mots

La concurrence a été partagée aujourd'hui http Plusieurs façons de mettre en oeuvre la demande , On dit asynchrone (Co - Process) Meilleure performance que Multithreading , En fait, ce qui doit être vu dans différentes scènes , Il n'y a pas de méthode unique pour tous les scénarios , L'auteur a fait une expérience , C'est aussi une demande url, Lorsque le nombre de concurrents dépasse 500 Heure, Le co - processus est nettement plus lent .

À propos de Python Programmation simultanée, Lire l'article :

Python Quelle Bibliothèque standard devrait être utilisée pour la programmation simultanée ?

Multithreading ou co - Threading pour la concurrence ?

PythonAsynchroneIOFonctionnement,Ça suffit de regarder ça

Python Opérations multithreadées

Si vous avez une meilleure mise en œuvre de l'asynchrone I/O Fonctionnement,Peut - être. Partage de messages Oh, mon Dieu..

J'ai vu ça , Tu es sûr de ne pas te concentrer ?

Références

[1]

grequests: https://github.com/spyoungtech/grequests

[2]

Gevent: http://www.gevent.org/

Cet article est partagé par Wechat public Number - PythonNuméro sept.(PythonSeven) ,Auteur:somenzz

La source originale et les informations reproduites sont détaillées dans le texte,En cas d'infraction,Veuillez contacter: [email protected] Supprimer.

Date de publication originale: 2021-08-26

Participation à cet articleTencent Cloud Self - media Sharing Plan,Bienvenue à la lecture,Partager ensemble.

版权声明
本文为[Somenzz]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210914180056991d.html

  1. Java 16 is coming online. You can't even use the features of Java 8, can you?
  2. Java (3) basic data types and their type conversion
  3. 一位Java大牛的BAT面试心得与经验总结,2021年Java春招面试经历,
  4. 一举拿下腾讯美团滴滴offer,快来瞧瞧这份Spring面试小抄!
  5. 一个Java应届生从上海离职,万字长文总结Java多进程,
  6. Seven design principles of java object-oriented design pattern
  7. 一個Java應届生從上海離職,萬字長文總結Java多進程,
  8. Un nouvel étudiant Java a quitté Shanghai et a résumé plusieurs processus Java.
  9. Prenez d'un coup l'offre de Tencent meituan et jetez un coup d'oeil à cette copie de l'entrevue de printemps!
  10. L'expérience et l'expérience d'un Maverick Java en matière d'entrevue sur les MTD, l'expérience de l'entrevue d'embauche du printemps Java en 2021,
  11. Interface graphique X: mise à jour des tables de rendu et optimisation du Code (compilation intégrée 10)
  12. Widget de vérification de fichiers personnalisés Linux
  13. Java thread pool - work queue
  14. [Part 7] - Summary of B2B2C e-commerce technology of spring cloud live mall managed by git branch
  15. Reflection type of Java Foundation
  16. Want to get started with data structures, but always fall under the pomegranate skirt of the linked list?
  17. Interviewer: do redis transactions satisfy atomicity?
  18. 一篇文章教你搞定计算机网络面试,350道Java面试真题分享,
  19. 一条正确的Java职业生涯规划,揭秘今年Java春招面试必问问题有哪些?
  20. 一名毕业三年的女程序媛面试头条经验,关于Redis主从节点数据过期一致性的思考,
  21. Huawei cloud guassdb (for redis) released a new version: Lua script and SSL connection encryption
  22. Java thread pool - work queue
  23. 一名畢業三年的女程序媛面試頭條經驗,關於Redis主從節點數據過期一致性的思考,
  24. Trois ans d'expérience d'entrevue avec une femme de programmation diplômée, une réflexion sur la cohérence de l'expiration des données de redis Master slave Node,
  25. Un plan de carrière Java correct, découvrez les questions que vous devez poser lors de l'entrevue d'embauche du printemps Java de cette année.
  26. 万字详解微服务的哨兵机制,架构师带你玩转Redis高性能缓存设计实战,
  27. Un article vous a appris à gérer les entrevues sur le Web, à partager 350 vraies questions d'entrevue Java,
  28. Jquery Tools Methodology collation, Sharing a little interview Experience
  29. Tutoriel de développement Java, compétences de base nécessaires pour interviewer un programmeur Java dans une grande usine,
  30. "Anti Mafia storm" has just finished, another criminal investigation play has come, and the supporting actor is more popular than the protagonist
  31. 萬字詳解微服務的哨兵機制,架構師帶你玩轉Redis高性能緩存設計實戰,
  32. L'architecte vous guidera dans la conception de cache haute performance de redis.
  33. Linux驱动开发: 杂项字符设备
  34. Jquery plug - in urianchor, app front end Development
  35. Linux驅動開發: 雜項字符設備
  36. Développement de pilotes Linux: périphériques de caractères divers
  37. Utilisez @ async dans Spring boot pour effectuer des appels asynchrones et accélérer l'exécution des tâches!
  38. $in jquery, Visualized Web Development Tool
  39. Le développement Java doit être fait. Les entrevues https demandent souvent une analyse complète.
  40. 不明白JVM虚拟机还怎么面试,一起刷完了这份1307页的Java面试宝典吧,
  41. 不断提升自己创造溢价的能力,字节跳动 阿里 华为 腾讯等大厂Java面试题,
  42. Jdk's Past Life: The Classic Features of Thin Number - java5 - - - 15 -, webfront Development
  43. Résumé des questions d'entrevue pour les ingénieurs en développement Java, analyse des questions d'entrevue à haute fréquence Dubbo,
  44. Améliorer continuellement leur capacité à créer des primes, et les questions d'entrevue Java d'Alibaba Huawei Tencent et d'autres grandes usines sont sautées en octets.
  45. Install docker YJ version of openSUSE 11.3
  46. Je ne comprends pas comment la machine virtuelle JVM peut encore interviewer, et j'ai terminé ce dictionnaire d'entrevue Java de 1307 pages.
  47. 中软国际Java机试,如何写出高效率的SQL?
  48. 中级Java工程师面试,阿里 头条 腾讯等大厂Java笔试题目分享,
  49. 两年Java开发经验,为什么spring能最好地改变Java?
  50. Echarts realizes the rotation of the moon (super simple, you can see it at a glance)
  51. Deux ans d'expérience dans le développement de Java, pourquoi Spring peut - il le mieux changer Java?
  52. Entretien d'ingénieur Java intermédiaire, partage de sujets d'examen écrit Java de grandes usines comme Alibaba headline Tencent,
  53. Zhongsoft International Java Machine test, comment écrire un SQL efficace?
  54. Reflection type of Java Foundation
  55. Comment gérer efficacement les changements dans les ressources k8s?Analyse du mécanisme de mise en œuvre de k8s informer
  56. Installation de jdk1.8
  57. MySQL column - Linux underlying interaction and RAID storage architecture
  58. Interviewer: do redis transactions satisfy atomicity?
  59. 兩年Java開發經驗,為什麼spring能最好地改變Java?
  60. Migration practice from zookeeper to Nacos