Python 3线程发布请求传递标头参数和数据

时间:2019-01-04 21:59:58

标签: python-3.x python-requests python-asyncio python-multithreading

我正试图使我的帖子请求更快,因为目前每条帖子需要3秒钟。由于我需要迭代n次,因此可能需要几个小时。因此,我开始寻找线程,异步调用和许多其他方法,但没有一个解决了我的问题。大多数问题是由于我无法指定发布请求的标头和参数。

我的Python版本是3.6.7

我的代码:

for i in range(0, 1000):
  assetId = jsonAssets[i]['id']
  uuidValue = uuid.uuid4()

  headers = {'Content-Type': 'application/json',}
  params = (('remember_token', '123456'),)

  data = ('{{"asset":'
          '{{"template":1,'
          '"uuid":"{uuidValue}", '
          '"assetid":{assetId}}}}}'
          .format(uuidValue = uuidValue, 
                  assetId = assetId))
  response = requests.post('http://localhost:3000/api/v1/assets', headers=headers, params=params, data=data)

一些尝试正在使用:

pool.apply_async

ThreadResponse

但是我无法像request.post那样设置标题或参数

那么,如何使用此标头,参数和数据更快地发出发布请求?

在此先感谢所有麻烦,这是我的第一篇stackoverflow帖子。

2 个答案:

答案 0 :(得分:0)

您应该使用aiohttp之类的异步库

答案 1 :(得分:0)

如果您可以正确地发出单个请求,则最快捷的方法是使用ThreadPoolExecutor

def single_request(i):
  assetId = jsonAssets[i]['id']
  uuidValue = uuid.uuid4()
  # ... all other requests stuff here

  return response


with ThreadPoolExecutor(max_workers=10) as executor:
    futures = {
        executor.submit(single_request, i): i
        for i 
        in range(1000)
    }

    for future in as_completed(futures):
        i = futures[future]
        try:
            res = future.result()
        except Exception as exc:
            print(f'excepiton in {i}: {exc}')
        else:
            print(res.text)