如何在python中用多线程打开Post-url

2024-05-19 11:03:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Windows机器上使用python2.7。我有一个带有数据和头的url数组,所以POST方法是必需的。 在简单的执行过程中,它可以很好地工作:

    rescodeinvalid =[]
    success = []
    for i in range(0,len(HostArray)):
       data = urllib.urlencode(post_data)
       req = urllib2.Request(HostArray[i], data)
       response = urllib2.urlopen(req)
       rescode=response.getcode()

       if responsecode == 400:
            rescodeinvalid.append(HostArray[i])

       if responsecode == 200:
           success.append(HostArray[i])

我的问题是,如果HostArray的长度非常大,那么在循环中需要花费很多时间。 那么,如何在一个多线程中检查HostArray的每个url。如果每个url的响应码是200,那么我在做不同的操作。我有数组来存储200和400个响应。 那么,如何在python中的多线程中实现这一点呢


Tags: 数据机器urldataifresponsewindows数组
0条回答
网友
1楼 · 发布于 2024-05-19 11:03:12

您的案例(基本上是将一个列表处理成另一个列表)看起来像是concurrent.futures的理想候选者(参见示例this answer),或者您可以一直到^{}。当然,使用ThreadPoolExecutor将并发运行的线程数限制在合理的范围内。在

网友
2楼 · 发布于 2024-05-19 11:03:12

如果你想在一个单独的线程中完成每一个任务,你可以做如下操作:

  rescodeinvalid =[]
  success = []

  def post_and_handle(url,post_data)
       data = urllib.urlencode(post_data)
       req = urllib2.Request(url, data)
       response = urllib2.urlopen(req)
       rescode=response.getcode()

       if responsecode == 400:
              rescodeinvalid.append(url) # Append is thread safe
       elif responsecode == 200:
              success.append(url)  # Append is thread safe

  workers = []
  for i in range(0,len(HostArray)):
         t = threading.Thread(target=post_and_handle,args=(HostArray[i],post_data))
         t.start()
         workers.append(t)

  # Wait for all of the requests to complete
  for t in workers:
       t.join()

我还建议使用请求:http://docs.python-requests.org/en/latest/

以及线程池: Threading pool similar to the multiprocessing Pool?

线程池使用率:

^{pr2}$
网友
3楼 · 发布于 2024-05-19 11:03:12

scrapy使用twisted library并行调用多个url,而无需为每个请求打开一个新线程的开销,它还可以管理内部队列以累积甚至优先化它们作为奖励您还可以通过设置限制并行请求的数量maximum concurrent requests,您可以启动一个废弃的spider作为外部进程,也可以从代码中启动,只需设置spider start_urls = HostArray

相关问题 更多 >

    热门问题