Как запустить бесконечный цикл в фоновом режиме? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть функция, которая постоянно контролирует API. По сути, функция получает данные, анализирует их и затем добавляет их в файл. затем он ждет 15 минут и делает то же самое снова и снова.

я хочу запустить этот цикл в фоновом режиме, чтобы не блокировать выполнение остальной части моего кода.

Ответы [ 4 ]

1 голос
/ 10 июля 2019

Если вы используете asyncio (я полагаю, вы из-за тега asyncio), запланированная операция может быть выполнена с помощью задачи.

import asyncio

loop = asyncio.get_event_loop()

async def check_api():
    while True:
        # Do API check, helps if this is using async methods
        await asyncio.sleep(15 * 60)  # 15 minutes (in seconds)

loop.create_task(check_api())

...  # Rest of your application

loop.run_forever()

Если ваша проверка API не асинхронна (или библиотека,используется для взаимодействия с ним - это не асинхронно) вы можете использовать Executor для запуска операции в отдельном потоке или процессе, сохраняя при этом asyncio API.

Например:

from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor()

def call_api():
    ...

async def check_api():
    while True:
        await loop.run_in_executor(executor, call_api)
        await asyncio.sleep(15 * 60)  # 15 minutes (in seconds)

Обратите внимание, что asyncio не делает ваш код параллельным автоматически, это совместная многозадачность, все ваши методы должны взаимодействовать с помощью await, длительная операция по-прежнему блокирует другие потоки, и в этом случае, Executor поможет.

0 голосов
/ 10 июля 2019

Это очень широко, но вы можете взглянуть на многопроцессорные или многопоточные модули Python.

Для запуска потока в фоновом режиме это будет выглядеть примерно так:

from threading import Thread

def background_task():
    # your code here

t = Thread(target=background_task)
t.start()

0 голосов
/ 10 июля 2019

Попробуйте многопоточность

import threading
def background():
    #The loop you want to run in back ground
b = threading.Thread(target=background)
b.start()
0 голосов
/ 10 июля 2019

Попробуйте многопоточность:

import threading

def background():
    while True:
        number = int(len(oilrigs)) * 49
        number += money
        time.sleep(1)

def foreground():
    // What you want to run in the foreground

b = threading.Thread(name='background', target=background)
f = threading.Thread(name='foreground', target=foreground)

b.start()
f.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...