выполнение асинхронных параллельных запросов api в python

#python #api #get-request

#питон #API #get-запрос

Вопрос:

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

 import requests import json import psycopg2 import time import csv  epics = [] with open('cmd.csv', newline='') as inputfile:  for row in csv.reader(inputfile):  epics.append(row[0])  # print(epics)  for epic in epics:  url = 'https://demo-api.ig.com/gateway/deal/positions/otc'  params = {  "epic": epic,  "expiry": "DFB",  "direction": "BUY",  "size": "1",  "orderType": "MARKET",  # "timeInForce":'null',  # "level":'null',  "guaranteedStop": "false",  # "stopLevel": 'null',  # "stopDistance":'null',  # "trailingStop":'null',  # "trailingStopIncrement":'null',  "forceOpen": "true",  # "limitLevel": 'null',  # "limitDistance":'null',  # "quoteId":'null',  "currencyCode": "GBP"  }   # Trade submission  time.sleep(1.5)  resp = requests.post(url, headers=headers, json=params)  print(url)  result = resp.json()  print(result)  

эпос-это просто список значений csv, который цикл повторяет и отправляет запрос на публикацию для каждого эпоса. Однако, поскольку я использую запросы, для перебора эпического списка требуется слишком много времени. Я хотел бы публиковать 100 одновременных запросов в секунду, так как это SLA с веб-сайта. Каждый запрос должен быть для уникального эпоса.

Может ли кто-нибудь любезно дать указания о том, как это сделать

Комментарии:

1. Python по умолчанию работает однопоточно. Поскольку время sleep составляет 1,5 секунды, невозможно выполнить более 1 запроса в секунду. Если вам нужен пареллизм, вы должны попробовать использовать либо threading или multiprocessing модуль.

2. Спасибо @white, не могли бы вы предоставить пример кода, который показывает, как это сделать, пожалуйста.

Ответ №1:

Вы можете попробовать что-то вроде этого.

Сначала оберните свой код в подобную функцию.

 def my_function(epic):  url = 'https://demo-api.ig.com/gateway/deal/positions/otc'  params = {  "epic": epic,  "expiry": "DFB",  "direction": "BUY",  "size": "1",  "orderType": "MARKET",  # "timeInForce":'null',  # "level":'null',  "guaranteedStop": "false",  # "stopLevel": 'null',  # "stopDistance":'null',  # "trailingStop":'null',  # "trailingStopIncrement":'null',  "forceOpen": "true",  # "limitLevel": 'null',  # "limitDistance":'null',  # "quoteId":'null',  "currencyCode": "GBP"  }   # Trade submission  time.sleep(1.5)  resp = requests.post(url, headers=headers, json=params)  print(url)  result = resp.json()  print(result)  

Далее вам нужно передать список того, что вы хотите, в функцию.

Используйте модуль многопроцессорной обработки и синтаксис для передачи списка в функцию. При этом используется многопроцессорная обработка.

 import multiprocessing  with multiprocessing.Pool() as pool:  pool.map(my_function, epics)   

Вы также можете сделать что-то подобное, в котором используется многопроцессорная обработка с многопоточностью.

 from multiprocessing.pool import Pool, ThreadPool from multiprocessing import cpu_count  max_requests = 100  # compute number of processes in our pool # the lesser of length of list to process and the number of cores we have pool_size = min(max_requests, cpu_count(), len(epics))  # create process pool based on number of cpu cores process_pool = Pool(pool_size)  # create thread pool thread_pool = ThreadPool(int(max_requests/pool_size)) worker = partial(my_function, process_pool)  # run the final function thread_pool.map(worker, epics)