【问题标题】:ThreadpoolExecotor missing some rows in pythonThreadpoolExecotor 在 python 中缺少一些行
【发布时间】:2021-12-05 09:48:55
【问题描述】:

我正在试验多线程,但不明白为什么它会跳过很多行? 请帮我改进我的代码 我可以使用shutdown fn来改善它吗?

import concurrent.futures
import requests
import json
import time

URLList = []
for i in range(100):
    URLList.append("https://randomuser.me/api/")
def getName(urlApi):
        print(requests.get(urlApi).json()["results"][0]["name"])
def main():
    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
        executor.submit(getName)
        executor.map(getName , URLList)

start_time = time.time()
main()
midtime = time.time() - start_time

print(f"--- {midtime} seconds ---")

输出是一些随机行而不是 100 行

{'title': 'Miss', 'first': 'Lily', 'last': 'Johnson'}
{'title': 'Mr', 'first': 'میلاد', 'last': 'سلطانی نژاد'}
{'title': 'Ms', 'first': 'Celina', 'last': 'Henry'}
{'title': 'Mr', 'first': 'آرمین', 'last': 'سالاری'}
{'title': 'Ms', 'first': 'Stans', 'last': 'Ordelman'}
{'title': 'Mr', 'first': 'Matthäus', 'last': 'Hilger'}
{'title': 'Ms', 'first': 'Marta', 'last': 'Flores'}
{'title': 'Mr', 'first': 'Alex', 'last': 'Gutierrez'}
{'title': 'Mr', 'first': 'Hugo', 'last': 'Walker'}
{'title': 'Mr', 'first': 'Vincent', 'last': 'Campbell'}
{'title': 'Mr', 'first': 'آریا', 'last': 'صدر'}
{'title': 'Mr', 'first': 'Lode', 'last': 'Mulderij'}
{'title': 'Miss', 'first': 'Manuela', 'last': 'Rubio'}
{'title': 'Mr', 'first': 'Jacob', 'last': 'Wang'}
{'title': 'Mr', 'first': 'رضا', 'last': 'کامروا'}
{'title': 'Mr', 'first': 'سهیل', 'last': 'مرادی'}
{'title': 'Miss', 'first': 'Kristin', 'last': 'Roberts'}
{'title': 'Mr', 'first': 'Allen', 'last': 'Weaver'}
{'title': 'Miss', 'first': 'Cathy', 'last': 'Johnston'}
{'title': 'Mr', 'first': 'Isaías', 'last': 'da Paz'}
{'title': 'Mr', 'first': 'Felix', 'last': 'Lam'}
{'title': 'Mr', 'first': 'Julio', 'last': 'Chambers'}
{'title': 'Mr', 'first': 'Felix', 'last': 'Johansen'}
{'title': 'Mr', 'first': 'Ruben', 'last': 'Mora'}
{'title': 'Mr', 'first': 'Marco', 'last': 'Diaz'}
{'title': 'Ms', 'first': 'Yvonne', 'last': 'Sims'}
{'title': 'Mr', 'first': 'Conrad', 'last': 'Owren'}
{'title': 'Mr', 'first': 'آرسین', 'last': 'گلشن'}
{'title': 'Mr', 'first': 'Aitor', 'last': 'Santos'}
{'title': 'Ms', 'first': 'Sally', 'last': 'Bell'}
{'title': 'Mr', 'first': 'Valentin', 'last': 'Marquez'}
{'title': 'Mr', 'first': 'Jacob', 'last': 'Mortensen'}
{'title': 'Monsieur', 'first': 'Nicolas', 'last': 'Lucas'}

请帮助我。

【问题讨论】:

    标签: python multithreading threadpoolexecutor


    【解决方案1】:

    使用以下 sn-p 时,我能够获得所有 100 个结果:

    def main():
        with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
            results = [executor.submit(getName , x) for x in URLList]
        print(len(results)) 
    

    但是,当我尝试实际查看结果时:

    [result.result() for result in results]
    

    我明白了:

    JSONDecodeError: Expecting value: line 1 column 1 (char 0)
    

    这是因为有些请求实际上并没有成功返回。

    所以让我们尝试稍微改变一下getName,看看失败时会发生什么:

    def getName(urlApi):
      request = requests.get(urlApi)
      try:
        return request.json()["results"][0]["name"]
      except:
        return request.text
    

    对于我们得到的一些行是:

    <html>
    <head>
    <title>Uh oh, something bad happened</title>
    </head>
    <body align='center'>
    <h1 align='center'>Uh oh, something bad happened</h1>
    <a class="twitter-timeline" data-width="450" data-height="700" data-theme="light" href="https://twitter.com/randomapi">Tweets by randomapi</a> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
    </body>
    </html>
    

    如果您尝试减少工作人员的数量,您会看到更多请求成功返回,这表明您面临一些速率限制。无论如何,就多线程而言,一切正常,您确实发送了一百个请求并收到了一百个响应。只是其中一些并不是您希望得到的 JSON 响应。

    max_workers 设置为1 时,我能够成功获得所有100 个回复。这样,请求是按顺序发送但异步发送的,这仍然是并行的,因此比简单地一个接一个地发送它们更快,在发送下一个请求之前等待每个响应。

    max_workers 最多为 4,我仍然能够成功获得 100% 的请求,但在 max_workers=5 大约一半的请求失败。您必须尝试看看哪种速率最有效 - 您始终可以重新发送失败的请求,但最好找到完全没有失败的最高速率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多