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