GCP Cloud Functions многопоточный почтовый запрос - PullRequest
0 голосов
/ 16 января 2019

Итак, у меня есть этот код ниже, который разбивает список идентификаторов в элементах x, затем перебирает их и делает кратным request.post для URL (облачная функция Google), но он отправляет только последнюю полезную нагрузку.

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()

Выход:

(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

Могу ли я составить первый запрос.пост, затем выполнить их? Я не понимаю, почему публикуется только последняя сгенерированная полезная нагрузка. Если вы проверите выходные данные из строки 13, вы увидите, что полезная нагрузка имеет такое же содержимое.

Спасибо

1 Ответ

0 голосов
/ 16 января 2019

Проблема в том, что вы используете payload.update() для изменения объекта payload, а затем пропускаете его. Это приводит к тому, что одна и та же полезная нагрузка используется для каждого потока, потому что к моменту выполнения запроса исходный payload был обновлен и теперь имеет последний набор _ids.

.

Вместо этого создайте новый dict из существующей полезной нагрузки:

for _ids in limits:
    t = Thread(target=worker, args=(recovery_url, dict(**payload, instances=_ids)))
    t.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...