{"id":24716,"date":"2026-09-16T16:57:15","date_gmt":"2026-09-16T16:57:15","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/tests-de-charge-http-avec-twisted-python-et-treq\/"},"modified":"2026-09-16T16:57:15","modified_gmt":"2026-09-16T16:57:15","slug":"tests-de-charge-http-avec-twisted-python-et-treq","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/","title":{"rendered":"Tests de charge HTTP avec Twisted Python et Treq"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Le secteur des API a ses d\u00e9fis, et maintenir la robustesse du syst\u00e8me aux heures de pointe en fait partie. C&rsquo;est pourquoi nous effectuons de nombreux tests de charge chez Mailgun.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Au fil du temps, nous avons essay\u00e9 de nombreuses approches, allant du simple test Apache Bench \u00e0 des suites de tests personnalis\u00e9es plus complexes. Mais cet article porte sur un test de charge \u00ab\u00a0rapide et sans fioritures\u00a0\u00bb, mais tr\u00e8s flexible, utilisant Python.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour l&rsquo;\u00e9criture de clients HTTP en Python, nous appr\u00e9cions particuli\u00e8rement la\u00a0<a href=\"http:\/\/docs.python-requests.org\/en\/latest\/\" target=\"_tabs\" rel=\"noopener noreferrer\">biblioth\u00e8que Requests<\/a>. C&rsquo;est ce que nous recommandons aux utilisateurs de notre API. Requests est formidable, mais elle a une faiblesse\u00a0: il s&rsquo;agit d&rsquo;un syst\u00e8me bloquant \u00e0 un seul appel par thread. <b>Il est difficile voire impossible de g\u00e9n\u00e9rer des dizaines de milliers de requ\u00eates\u00a0<\/b><b><i>rapidement<\/i><\/b><b>\u00a0avec elle.<\/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-4614\"><p class=\"h5 m-0\" id=\"toc-title-4614\">Table des mati\u00e8res<\/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=\"#presentation-de-treq-sur-twisted\">Pr\u00e9sentation de Treq sur 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=\"#le-script-de-test-simple\">Le script de test simple<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Pr\u00e9sentation de Treq sur Twisted<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour r\u00e9soudre ce probl\u00e8me, nous nous sommes pench\u00e9s sur Treq (<a href=\"https:\/\/github.com\/dreid\/treq\" target=\"_tabs\" rel=\"noopener noreferrer\">d\u00e9p\u00f4t Github<\/a>). Treq est une biblioth\u00e8que de client HTTP inspir\u00e9e par Requests, mais elle fonctionne sur Twisted et en poss\u00e8de les capacit\u00e9s typiques\u00a0: elle est asynchrone et hautement concurrente en mati\u00e8re d&rsquo;entr\u00e9es\/sorties r\u00e9seau.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Treq n&rsquo;est pas du tout sp\u00e9cifique aux tests de charge\u00a0: c&rsquo;est un excellent outil pour \u00e9crire des clients HTTP hautement concurrents en g\u00e9n\u00e9ral, comme les robots d&rsquo;indexation. Treq est \u00e9l\u00e9gante, simple \u00e0 utiliser et puissante. Voici un exemple\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Le script de test simple<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vous trouverez ci-dessous un script simple qui utilise Treq pour bombarder une URL unique avec le nombre maximum de requ\u00eates possible.<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Le r\u00e9sultat\u00a0:<\/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=\"Copier dans le presse-papiers\" data-clipboard-success-label=\"Copi\u00e9\u00a0!\" data-clipboard-error-label=\"Impossible de copier\" data-tooltip=\"Copier dans le presse-papiers\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copier dans le presse-papiers\">\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\">Les requ\u00eates \u00ab\u00a0Generated\u00a0\u00bb sont celles qui ont \u00e9t\u00e9 pr\u00e9par\u00e9es, mais que le r\u00e9acteur Twisted n&rsquo;a pas encore envoy\u00e9es. Ce script ignore toutes les erreurs par souci de simplicit\u00e9. L&rsquo;ajout des statistiques pour les d\u00e9passements de d\u00e9lai est laiss\u00e9 \u00e0 titre d&rsquo;exercice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Ce script peut servir de point de d\u00e9part, \u00eatre am\u00e9lior\u00e9 et \u00e9tendu <\/b>avec votre propre logique personnalis\u00e9e sp\u00e9cifique \u00e0 l&rsquo;application. Une am\u00e9lioration sugg\u00e9r\u00e9e serait d&rsquo;utiliser\u00a0<a href=\"http:\/\/docs.python.org\/2\/library\/collections.html#counter-objects\" target=\"_tabs\" rel=\"noopener noreferrer\">collections.Counter<\/a> au lieu des disgracieuses variables globales. Le script s&rsquo;ex\u00e9cute sur un seul thread. Pour tirer le maximum de requ\u00eates d&rsquo;une machine, un outil tel que\u00a0<a href=\"http:\/\/docs.python.org\/2\/library\/multiprocessing.html\" target=\"_tabs\" rel=\"noopener noreferrer\">multiprocessing<\/a>\u00a0peut \u00eatre utilis\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bons tests de charge\u00a0!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cordialement,<br>\nL&rsquo;\u00e9quipe 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_3432b157ca1f6937e5124d0297ae0931\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                S&rsquo;inscrire            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_3432b157ca1f6937e5124d0297ae0931\">\r\n                Lancez-vous, c&rsquo;est facile ! Et c&rsquo;est gratuit.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">D\u00e9couvrez ce que vous pouvez accomplir avec la meilleure plateforme de livraison d\u2019emails au monde.<\/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>Le secteur des API a ses d\u00e9fis, et maintenir la robustesse du syst\u00e8me aux heures de pointe en fait partie. C&rsquo;est pourquoi nous effectuons de nombreux tests de charge chez 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-24716","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>Tests de charge HTTP avec Twisted Python et Treq - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"Treq est une biblioth\u00e8que de client HTTP inspir\u00e9e par Requests, mais elle fonctionne sur Twisted et en poss\u00e8de les capacit\u00e9s typiques\u00a0: elle est asynchrone et hautement concurrente en mati\u00e8re d&#039;entr\u00e9es\/sorties r\u00e9seau. En savoir plus \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\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tests de charge HTTP avec Twisted Python et Treq - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"Treq est une biblioth\u00e8que de client HTTP inspir\u00e9e par Requests, mais elle fonctionne sur Twisted et en poss\u00e8de les capacit\u00e9s typiques\u00a0: elle est asynchrone et hautement concurrente en mati\u00e8re d&#039;entr\u00e9es\/sorties r\u00e9seau. En savoir plus \u2013\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-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 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/tests-de-charge-http-avec-twisted-python-et-treq\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/tests-de-charge-http-avec-twisted-python-et-treq\\\/\",\"name\":\"Tests de charge HTTP avec Twisted Python et Treq - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/tests-de-charge-http-avec-twisted-python-et-treq\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/tests-de-charge-http-avec-twisted-python-et-treq\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2026-09-16T16:57:15+00:00\",\"description\":\"Treq est une biblioth\u00e8que de client HTTP inspir\u00e9e par Requests, mais elle fonctionne sur Twisted et en poss\u00e8de les capacit\u00e9s typiques\u00a0: elle est asynchrone et hautement concurrente en mati\u00e8re d'entr\u00e9es\\\/sorties r\u00e9seau. En savoir plus \u2013\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/tests-de-charge-http-avec-twisted-python-et-treq\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/tests-de-charge-http-avec-twisted-python-et-treq\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/it-and-engineering\\\/tests-de-charge-http-avec-twisted-python-et-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\\\/fr\\\/blog\\\/it-and-engineering\\\/tests-de-charge-http-avec-twisted-python-et-treq\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tests de charge HTTP avec Twisted Python et Treq\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/fr\\\/#\\\/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\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tests de charge HTTP avec Twisted Python et Treq - Transactional Email API Service For Developers | Mailgun","description":"Treq est une biblioth\u00e8que de client HTTP inspir\u00e9e par Requests, mais elle fonctionne sur Twisted et en poss\u00e8de les capacit\u00e9s typiques\u00a0: elle est asynchrone et hautement concurrente en mati\u00e8re d'entr\u00e9es\/sorties r\u00e9seau. En savoir plus \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\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/","og_locale":"fr_FR","og_type":"article","og_title":"Tests de charge HTTP avec Twisted Python et Treq - Transactional Email API Service For Developers | Mailgun","og_description":"Treq est une biblioth\u00e8que de client HTTP inspir\u00e9e par Requests, mais elle fonctionne sur Twisted et en poss\u00e8de les capacit\u00e9s typiques\u00a0: elle est asynchrone et hautement concurrente en mati\u00e8re d'entr\u00e9es\/sorties r\u00e9seau. En savoir plus \u2013","og_url":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-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 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/","url":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/","name":"Tests de charge HTTP avec Twisted Python et Treq - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2026-09-16T16:57:15+00:00","description":"Treq est une biblioth\u00e8que de client HTTP inspir\u00e9e par Requests, mais elle fonctionne sur Twisted et en poss\u00e8de les capacit\u00e9s typiques\u00a0: elle est asynchrone et hautement concurrente en mati\u00e8re d'entr\u00e9es\/sorties r\u00e9seau. En savoir plus \u2013","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-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\/fr\/blog\/it-and-engineering\/tests-de-charge-http-avec-twisted-python-et-treq\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/fr\/blog\/"},{"@type":"ListItem","position":3,"name":"Tests de charge HTTP avec Twisted Python et Treq"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/fr\/#website","url":"https:\/\/www.mailgun.com\/fr\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Des API d\u2019emails transactionnels puissantes qui vous permettent d'envoyer, de recevoir et de suivre des emails, con\u00e7ues pour les d\u00e9veloppeurs. En savoir plus d\u00e8s aujourd'hui !","publisher":{"@id":"https:\/\/www.mailgun.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/fr\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.mailgun.com\/fr\/#\/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\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/24716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/users\/13"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog\/24716\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/media?parent=24716"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/fr\/wp-json\/wp\/v2\/blog_category?post=24716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}