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