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

Что нужно изменить в коде, чтобы избежать "замедления" на 1 секунду при выполнении игрового цикла?
  • 25 января 2024 г. 9:48
Ответы на вопрос 2
Чтобы одна функция выполнялась непрерывно, а другая совершала действия параллельно каждую секунду, можно воспользоваться потоками (threads) в Python. Воспользуемся библиотекой `threading`. Ниже пример кода с двумя функциями:

```python
import threading
import time

def function_continuously():
    while True:
        # здесь ваш непрерывный код
        print("Function 1 is running continuously.")
        time.sleep(0.1)  # небольшая задержка для демонстрации

def function_every_second():
    while True:
        # код, который нужно выполнять каждую секунду
        print("Function 2 is running every second.")
        time.sleep(1)  # задержка на 1 секунду

# создание потоков
thread_continuously = threading.Thread(target=function_continuously)
thread_every_second = threading.Thread(target=function_every_second)

# запуск потоков
thread_continuously.start()
thread_every_second.start()

# присоединение потоков, если нужно ждать их завершения перед выходом из программы
# тут можно не использовать, если у нас бесконечные циклы
# thread_continuously.join()
# thread_every_second.join()
```

Чтобы избежать "замедления" на 1 секунду при выполнении игрового цикла, необходимо обеспечить, чтобы задержка не влияла на цикл, который должен работать непрерывно. В примере выше это достигается за счёт использования отдельных потоков: каждая функция работает в своём потоке, не мешая друг другу. Код функции `function_continuously` не содержит долгих задержек и может выполняться практически без перерывов.

Если есть более сложные задачи синхронизации или необходимость более точного управления временем выполнения функции, то можно использовать другие механизмы, например, `asyncio` для асинхронного программирования или более сложную логику синхронизации с использованием `Event`, `Condition`, `Semaphore` и других инструментов, предоставляемых модулем `threading`.

Этот код запускает потоки (они один раз исполняются) потом ждет их завершения. И это в цикле.
Проблема в том, что на каждой итерации этого цикла вы будете ждать, пока monster thread спит.

Потоки тут вообще бесполезны, вы с тем же успехом можете просто вызвать функции напрямую.

Потоки должны быть запущены один раз и работать в фоне. Тот, который каждую секунду что-то делает, должен внутри содержать цикл и работать бесконечно, на каждой итерации засыпать на 1 секунду.
Похожие вопросы