как опубликовать API json с параллельной обработкой?

#python #api #curl #post #parallel-processing

Вопрос:

У меня есть такой код:

 import requests
from multiprocessing import Pool
import json
import time
from datetime import datetime as dt

BASE_URL = 'http://localhost:3000/test'

with open('data.json', 'r') as f:
    list_dict = json.load(f)


def resource_post(post_data):
    stuff_got = []
    timestamp = dt.now().strftime('%Y%m%d %H:%M:%S:%f')[:-3]  # timestamp
    post_data["timestamp"] = timestamp
    response = requests.post(BASE_URL, json=post_data)
    stuff_got.append(response.json())
    print(stuff_got) # print hasil response
    df = pd.DataFrame.from_dict(stuff_got)
    df.to_csv("output.txt", sep='|', mode='a', index=False, header=False) 
    #time.sleep(0.1) #delay
    return stuff_got

if __name__ == '__main__':  
    start=time.time()
    pool = Pool()
    with pool as p:
        p.map(resource_post,list_dict)
        p.close()
        p.join()
    elapsed = (time.time() - start)  
    print("n","time elapsed is :", elapsed)
 

в файле data.json:

 [{"first_name":"John","last_name":"Swen"},{"first_name":"Ricard","last_name":"Candra"}]

 

в BASE_URL есть такие данные:

 {
  "body": {
    "first_name": "Sebastian",
    "last_name": "Eschweiler"
}
 

Я хочу опубликовать словарь из data.json в формате:

 {
  "body": {
    "first_name":"John",
    "last_name":"Swen"
  }
}
 

все приведенные выше данные будут зациклены и сгенерируют ответ {«Код ответа»: «0006», «Сообщение ответа»: «успех», «имя пользователя»: «Джон»} с сервера. Я введу ответ в output.txt файл в формате:

 0006 | success | John.
 

итак, как сделать так, чтобы каждый словарь в data.json был отправлен на сервер в формате:

 {
  "body": {
    "first_name":"John",
    "last_name":"Swen"
  }
}
 

Ответ №1:

Я думаю, что что-то вроде этого-это то, что вам нужно.

  • Используйте общий requests.Session() доступ, чтобы ускорить процесс.
  • Не считывайте входные данные на верхнем уровне; они также будут считываться отдельно во всех дочерних элементах многопроцессорной обработки (во всяком случае, в Windows).
  • Вы вообще не проверяли ответы на ошибки.
  • Вам не нужны Панды для записи данных в формате CSV в файл.
  • Запись данных в файлы теперь является задачей, выполняемой мастером многопроцессорной обработки, чтобы, например, избежать того, чтобы два процесса мешали записи друг друга.
  • Pool.imap_unordered() быстрее, но неупорядочен. Используйте imap() , если вам нужен заказ.
 import json
import time
from datetime import datetime as dt
from multiprocessing import Pool

import requests

BASE_URL = 'http://localhost:3000/test'

sess = requests.Session()


def resource_post(data_from_json):
    post_data = {
        "timestamp": dt.now().strftime('%Y%m%d %H:%M:%S:%f')[:-3],
        "body": data_from_json,
    }
    response = sess.post(BASE_URL, json=post_data)
    response.raise_for_status()
    return response.json()


def main():
    with open('data.json', 'r') as f:
        list_dict = json.load(f)
    start = time.time()
    with open("output.txt", "a") as outf:
        with Pool() as p:
            for resp in p.imap_unordered(resource_post, list_dict):
                print(resp["responseCode"], resp["responseMessage"], resp["first_name"], sep="|", file=outf)
    elapsed = (time.time() - start)
    print("n", "time elapsed is :", elapsed)


if __name__ == '__main__':
    main()