Как запустить функции Python синхронно? - PullRequest
0 голосов
/ 21 мая 2019

Я создавал дерзкого чат-бота для Python, в котором есть несколько пользовательских игр, которые я добавляю, чтобы зрителям было что-то использовать, пока они смотрят мой поток.Моя текущая цель - сделать игру в поединок с кубиками (игра на двоих, где тот, кто наберет наибольшее число, выигрывает сумму сделанных ставок).Чтобы играть, я хочу, чтобы оба игрока приняли матч, прежде чем разрешить его продолжить, но я также хочу реализовать таймер матча, чтобы, если другой пользователь не принял матч до истечения таймера, он отменил игру.,Я хочу создать новую ветку для каждой игры и отсканировать, чтобы увидеть, истек ли срок действия игры, но мне нужно, чтобы они запускались параллельно с остальным чат-ботом, иначе у меня может быть только одна игра за раз, иостальная часть бота остановится, когда это произойдет.

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

processes = []
# Tick has a basic print statement, and a sleep statement for testing.
# Tried without the sleep, and used a for loop to print "test" 100 times as well to see if the sleep was causing the issue
tickprocess = multiprocessing.Process(target=tick()) 
processes.append(tickprocess)

# Main initializes settings and starts the chatbot
chatbotprocess = multiprocessing.Process(target=main()) 
processes.append(chatbotprocess)

for item in processes:
    item.start()

Что он делает, так это запускает тиковый процесс, но ожидает его завершения перед запуском процесса chatbot, который противоположениз того, что я хочу сделать, так как я мог бы просто вызвать функцию галочки, а затем функцию main, чтобы получить тот же результат.Я неправильно понимаю, для чего эти модули?Конечная цель состоит в том, чтобы запустить игровой поток при получении команды игры в кости, но при этом позволить боту работать синхронно и обрабатывать другие команды и игры (все игры к этому моменту запускаются мгновенно или достаточно близко, чтобы моментально не возникали конфликты).

1 Ответ

2 голосов
/ 21 мая 2019

tick() и main() являются вызовами функций.Таким образом, практически вы вызываете функцию tick, получаете результат (предположительно None), а затем передаете этот результат в multiprocessing.Process().

. Вместо этого вы хотите передать tick(и более поздние main) функции для multiprocessing.Process():

tickprocess = multiprocessing.Process(target=tick)

Если вы тщательно проверяете документацию (https://docs.python.org/3.4/library/multiprocessing.html?highlight=process#the-process-class),, то это прямо в первом примере:

from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))  # <------ target=f, not target=f()
    p.start()
    p.join()
...