Есть ли способ сделать цикл, который работает в фоновом режиме, в то время как другой код продолжает работать в Python? - PullRequest
2 голосов
/ 13 марта 2019

Я действительно новичок в программировании, мне было интересно, есть ли способ запустить цикл while на фоне кода, уже запущенного в Python?

Я думал о чем-то вроде

While True: print("gibberish") print("pass")

с выводом чего-то вроде:

'gibberish gibberish pass gibberish .....' *

(не обязательно вэтот заказ, пока я получаю аналогичный результат)

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

Вы можете использовать multiprocessing или threading:

def background_code():
    while some_condition:
        print("gibberish")

...
thread = threading.Thread(target=background_code, args=(), kwargs={})
thread.start()
print("pass")
...

И multiprocessing, и threading имеют очень похожие API, и какой из них использовать, зависит от вашего варианта использования - различие между процессами и потоками не является одним для этого вопроса. Вы вероятно захотите threading для того, над чем вы сейчас работаете, но бывают разные ситуации, в которых вы бы предпочли одно или другое.

1 голос
/ 13 марта 2019

Вы можете обратиться к следующему коду.

import threading

def func1():
    for i in range(10):
        print("gibberish")

def func2():
    print("pass")

t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)


if __name__ == '__main__':
    t1.start()
    t2.start()

То, что он делает, запускает методы func1 и func2 одновременно, чтобы предоставленные методы выполнялись как фоновые задачи друг для друга.

0 голосов
/ 13 марта 2019

Вот что-то похожее с использованием asyncio (требуется python 3.7 +):

import asyncio

async def loop():
    while True:
        print("gibberish")
        await asyncio.sleep(0.5)

async def main():
    future = asyncio.ensure_future(loop())
    for i in range(100):
        print("pass")
        await asyncio.sleep(1)
    future.cancel()
asyncio.get_event_loop().run_until_complete(main())    

Это выведет два gibberish для каждого pass.Вы можете изменить время ожидания, чтобы изменить соотношение.

Здесь main и loop - это сопрограммы , где одновременно выполняется только одна.Вызовы await ... - это точки, где выполнение потенциально уступает другим сопрограммам.

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