首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GCP云函数多线程post请求

GCP云函数多线程post请求
EN

Stack Overflow用户
提问于 2019-01-16 19:57:36
回答 1查看 1.1K关注 0票数 1

所以我有下面的代码,它在x个项目中生成一个is列表,然后遍历它们,并生成一个指向URL的多个request.post (一个google云函数),但是,它只发送最后一个有效负载。

代码语言:javascript
运行
复制
from threading import Thread
from pprint import pprint
import logging
import requests
import os
import time

logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-10s) %(message)s',)

def worker(url, payload):
    response = requests.post(url, json=payload)
    pprint(payload)
    response.headers['Content-Type'] = "application/json"
    response.raise_for_status()
    pprint(response.content.decode('UTF-8'))

def chunks(l, n):
    """Yield successive n-sized chunks from a list."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

secret = 'sometoken'
recovery_url = 'https://some.cloudfuntion.url.here'

ids = [2018345610079096363, 2977875406043034415, 3271712161922849730, 419748955619930226,
       5244962103551406903, 5803235572026782321, 7879812282087191078, 9098437513491289540]

payload = {
    "message": secret,
    "action": "DR",
    "project": 'planar-depth-225211'
}
# LIMIT DR REQUESTS BY A SPECIFIC INT
limits = list(chunks(ids, 4))

for _ids in limits:
    payload.update({"instances": _ids})
    t = Thread(target=worker, args=(recovery_url, payload,))
    t.start()

输出:

代码语言:javascript
运行
复制
(Thread-1  ) Starting new HTTPS connection (1): xxx.cloudfunctions.net:443
(Thread-2  ) Starting new HTTPS connection (1): xxx.cloudfunctions.net:443
(Thread-2  ) https:xxx.cloudfunctions.net:443 "POST /recovery HTTP/1.1" 200 21
'Recovery with Success' 
'Recovery with Success' 
(Thread-1  ) https://xxx.cloudfunctions.net:443 "POST /recovery HTTP/1.1" 200 21

我可以先编写request.post,然后执行它们吗?我不明白为什么只发布最后生成的有效负载。如果检查第13行的输出,您将看到有效负载具有相同的内容。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-17 01:10:21

问题是您正在使用payload.update()来改变payload对象,然后传递它。这会导致每个线程使用相同的有效负载,因为在发出请求时,原始payload已经更新为具有最后一组_ids

相反,可以从现有有效负载创建一个新的dict

代码语言:javascript
运行
复制
for _ids in limits:
    t = Thread(target=worker, args=(recovery_url, dict(**payload, instances=_ids)))
    t.start()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54216592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档