{"id":24459,"date":"2026-09-16T14:41:32","date_gmt":"2026-09-16T14:41:32","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/pruebas-de-estres-http-con-twisted-python-y-treq\/"},"modified":"2026-09-16T14:41:32","modified_gmt":"2026-09-16T14:41:32","slug":"pruebas-de-estres-http-con-twisted-python-y-treq","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/","title":{"rendered":"Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Estar en el sector de las API tiene sus retos, y mantener la solidez del sistema durante las horas punta es uno de ellos. Por eso hacemos muchas pruebas de estr\u00e9s aqu\u00ed en Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con el tiempo hemos probado diferentes enfoques, desde el simple Apache bench hasta conjuntos de pruebas personalizados m\u00e1s complejos. Pero este art\u00edculo trata sobre unas pruebas de estr\u00e9s \u201cr\u00e1pidas y rudimentarias\u201d, aunque muy flexibles, con Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando se trata de programar clientes HTTP en Python, somos fans de la\u00a0<a href=\"http:\/\/docs.python-requests.org\/en\/latest\/\" target=\"_tabs\" rel=\"noopener noreferrer\">biblioteca Requests<\/a>. Esto es lo que recomendamos a los usuarios de nuestra API. Requests es genial, pero tiene un punto d\u00e9bil: es un sistema bloqueante de una llamada por hilo. <b>Es dif\u00edcil o imposible generar decenas de miles de peticiones\u00a0<\/b><b><i>r\u00e1pidamente<\/i><\/b><b>\u00a0con ella.<\/b><\/p>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-3869\"><p class=\"h5 m-0\" id=\"toc-title-3869\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#presentamos-treq-en-twisted\">Presentamos Treq en Twisted<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#el-script-de-prueba-sencillo\">El script de prueba sencillo<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Presentamos Treq en Twisted<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para resolver este problema, analizamos Treq (<a href=\"https:\/\/github.com\/dreid\/treq\" target=\"_tabs\" rel=\"noopener noreferrer\">repositorio de Github<\/a>). Treq es una biblioteca de cliente HTTP inspirada en Requests, pero se ejecuta en Twisted y posee las funciones t\u00edpicas de Twisted: es as\u00edncrona y altamente concurrente en lo que respecta a las E\/S de red.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Treq no es exclusiva para pruebas de estr\u00e9s en absoluto: es una gran herramienta para programar clientes HTTP altamente concurrentes en general, como los rastreadores web. Treq es elegante, f\u00e1cil de usar y potente. Aqu\u00ed tienes un ejemplo:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                     &gt;&gt;&gt; from treq import get\r\n    &gt;&gt;&gt; def done(response):\r\n    ... print response.code\r\n    ... reactor.stop()\r\n    &gt;&gt;&gt; get(&quot;http:\/\/www.github.com&quot;).addCallback(done)\r\n    &gt;&gt;&gt; from twisted.internet import reactor\r\n    &gt;&gt;&gt; reactor.run() 200\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">El script de prueba sencillo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n se muestra un script sencillo que utiliza Treq para bombardear una \u00fanica URL con el mayor n\u00famero de peticiones posible.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                     #!\/usr\/bin\/env python  \r\n    from twisted.internet import epollreactor  \r\n    epollreactor.install()\r\n    from twisted.internet import reactor, task  \r\n    from twisted.web.client import HTTPConnectionPool  \r\n    import treq  \r\n    import random  \r\n    from datetime import datetime\r\n    req_generated = 0  \r\n    req_made = 0  \r\n    req_done = 0\r\n    cooperator = task.Cooperator()\r\n    pool = HTTPConnectionPool(reactor)\r\n    def counter():  \r\n    &#039;&#039;&#039;This function gets called once a second and prints the progress at one \r\n    second intervals. \r\n    &#039;&#039;&#039;\r\n    print(&quot;Requests: {} generated; {} made; {} done&quot;.format(\r\n    req_generated, req_made, req_done))\r\n    # reset the counters and reschedule ourselves\r\n    req_generated = req_made = req_done = 0\r\n    reactor.callLater(1, counter)\r\n    def body_received(body):  \r\n    global req_done\r\n    req_done += 1\r\n    def request_done(response):  \r\n    global req_made\r\n    deferred = treq.json_content(response)\r\n    req_made += 1\r\n    deferred.addCallback(body_received)\r\n    deferred.addErrback(lambda x: None)  # ignore errors\r\n    return deferred\r\n    def request():  \r\n    deferred = treq.post(&#039;http:\/\/api.host\/v2\/loadtest\/messages&#039;,\r\n         auth=(&#039;api&#039;, &#039;api-key&#039;),\r\n         data={&#039;from&#039;: &#039;Loadtest &#039;,\r\n               &#039;to&#039;: &#039;to@example.org&#039;,\r\n               &#039;subject&#039;: &quot;test&quot;},\r\n         pool=pool)\r\n    deferred.addCallback(request_done)\r\n    return deferred\r\n    def requests_generator():  \r\n    global req_generated\r\n    while True:\r\n    deferred = request()\r\n    req_generated += 1\r\n    # do not yield deferred here so cooperator won&#039;t pause until\r\n    # response is received\r\n    yield None\r\n    if __name__ == &#039;__main__&#039;:  \r\n    # make cooperator work on spawning requests\r\n    cooperator.cooperate(requests_generator())\r\n    # run the counter that will be reporting sending speed once a second\r\n    reactor.callLater(1, counter)\r\n    # run the reactor\r\n    reactor.run()\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">El resultado:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                Python                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-Python\">\r\n                                <code id=\"code_0_content\" class=\"language-Python\">\r\n\r\n                                    2013-04-25 09:30 Requests: 327 generated; 153 sent; 153 received \r\n2013-04-25 09:30 Requests: 306 generated; 156 sent; 156 received \r\n2013-04-25 09:30 Requests: 318 generated; 184 sent; 154 received\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Las \u201cgeneradas\u201d son las peticiones que se han preparado, pero que el reactor de Twisted a\u00fan no ha enviado. Para simplificar, este script ignora todos los errores; a\u00f1adir las estad\u00edsticas de los tiempos de espera se deja como ejercicio para quien lo lea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>El script puede servir como punto de partida y mejorarse y ampliarse <\/b>con tu propia l\u00f3gica espec\u00edfica de la aplicaci\u00f3n. Una sugerencia de mejora ser\u00eda utilizar\u00a0<a href=\"http:\/\/docs.python.org\/2\/library\/collections.html#counter-objects\" target=\"_tabs\" rel=\"noopener noreferrer\">collections.Counter<\/a> en lugar de las antiest\u00e9ticas variables globales. El script se ejecuta en un solo hilo, y para exprimir al m\u00e1ximo el n\u00famero de peticiones de una m\u00e1quina habr\u00eda que usar algo como\u00a0<a href=\"http:\/\/docs.python.org\/2\/library\/multiprocessing.html\" target=\"_tabs\" rel=\"noopener noreferrer\">multiprocessing<\/a>\u00a0se puede usar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00a1Felices pruebas de estr\u00e9s!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un saludo,<br>\nEl equipo de Mailgun<\/p>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_3a55f4cefba8f35cc14e9f3952c15694\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Reg\u00edstrate            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_3a55f4cefba8f35cc14e9f3952c15694\">\r\n                Empezar es facil\u00edsimo. Y gratis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Descubre todo lo que puedes lograr con la mejor plataforma de entrega de emails del mundo.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Estar en el sector de las API tiene sus retos, y mantener la solidez del sistema durante las horas punta es uno de ellos. Por eso hacemos muchas pruebas de estr\u00e9s aqu\u00ed en Mailgun.<\/p>\n","protected":false},"author":13,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[23],"class_list":["post-24459","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-it-and-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Treq es una biblioteca de cliente HTTP inspirada en Requests, pero se ejecuta en Twisted y posee las funciones t\u00edpicas de Twisted: es as\u00edncrona y altamente concurrente en lo que respecta a las E\/S de red. M\u00e1s informaci\u00f3n \u2013\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Treq es una biblioteca de cliente HTTP inspirada en Requests, pero se ejecuta en Twisted y posee las funciones t\u00edpicas de Twisted: es as\u00edncrona y altamente concurrente en lo que respecta a las E\/S de red. M\u00e1s informaci\u00f3n \u2013\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/pruebas-de-estres-http-con-twisted-python-y-treq\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/pruebas-de-estres-http-con-twisted-python-y-treq\\\/\",\"name\":\"Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/pruebas-de-estres-http-con-twisted-python-y-treq\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/pruebas-de-estres-http-con-twisted-python-y-treq\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2026-09-16T14:41:32+00:00\",\"description\":\"Treq es una biblioteca de cliente HTTP inspirada en Requests, pero se ejecuta en Twisted y posee las funciones t\u00edpicas de Twisted: es as\u00edncrona y altamente concurrente en lo que respecta a las E\\\/S de red. M\u00e1s informaci\u00f3n \u2013\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/pruebas-de-estres-http-con-twisted-python-y-treq\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/pruebas-de-estres-http-con-twisted-python-y-treq\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/pruebas-de-estres-http-con-twisted-python-y-treq\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/pruebas-de-estres-http-con-twisted-python-y-treq\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq - Transactional Email API Service For Developers | Mailgun","description":"Treq es una biblioteca de cliente HTTP inspirada en Requests, pero se ejecuta en Twisted y posee las funciones t\u00edpicas de Twisted: es as\u00edncrona y altamente concurrente en lo que respecta a las E\/S de red. M\u00e1s informaci\u00f3n \u2013","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/","og_locale":"es_ES","og_type":"article","og_title":"Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq - Transactional Email API Service For Developers | Mailgun","og_description":"Treq es una biblioteca de cliente HTTP inspirada en Requests, pero se ejecuta en Twisted y posee las funciones t\u00edpicas de Twisted: es as\u00edncrona y altamente concurrente en lo que respecta a las E\/S de red. M\u00e1s informaci\u00f3n \u2013","og_url":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/","url":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/","name":"Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2026-09-16T14:41:32+00:00","description":"Treq es una biblioteca de cliente HTTP inspirada en Requests, pero se ejecuta en Twisted y posee las funciones t\u00edpicas de Twisted: es as\u00edncrona y altamente concurrente en lo que respecta a las E\/S de red. M\u00e1s informaci\u00f3n \u2013","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/pruebas-de-estres-http-con-twisted-python-y-treq\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Pruebas de estr\u00e9s de HTTP con Twisted Python y Treq"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/24459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/24459\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=24459"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=24459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}