Я довольно новичок в программировании на Python, и нитки не являются моей областью знаний. У меня есть проблема, для которой я надеюсь, что люди здесь могут помочь мне.Уведомить основной нить, когда нить была сделана
Задание: В качестве части моей магистерской диссертации мне нужно создать игру с смешанной реальностью, которая включает в себя многопользовательскую способность. в моем игровом дизайне каждый игрок может установить множество ловушек, каждый из которых активен в течение определенного периода времени, например. 30 сек. Чтобы поддерживать согласованное состояние игры для всех игроков, необходимо проверить все время на стороне сервера, которая реализована на Python.
Я решил начать нить python, каждый раз, когда новая ловушка укладывается игроком и запускает таймер на потоке. Вся эта часть прекрасна, но реальная проблема возникает, когда мне нужно уведомить главный поток о том, что время для этой конкретной ловушки, так что я могу сообщить об этом клиенту (устройство Android).
Я попытался создать очередь и вставить информацию в очередь, когда задача выполнена, но я не могу сделать queue.join(), так как она будет помещать основной поток на удержание, пока задача не будет выполнена, и это не то, что я не нуждаюсь и не идеален в моем случае, поскольку основной поток постоянно общается с клиентом, и если он остановлен, тогда вся связь с игроками остановится.
Мне нужен вторичный поток, который запускает таймер, чтобы сообщить основному потоку, как только закончится время, что время закончилось и отправит идентификатор ловушки, чтобы я мог передавать эту информацию клиенту android, чтобы удалить его. Как я могу достичь этого?
Любые другие предложения о том, как эта задача может быть достигнута без запуска Gazillion потоков, также приветствуется .. :) :)
Заранее спасибо за помощь ..
Приветствия
спасибо за быстрый ответ .. я обязательно посмотрю идею кучи и посмотрю, могу ли я использовать ее в своем сценарии. У меня есть один вопрос, хотя об идее многопоточного способа: – vivek86
, когда я должен точно выполнить q.get() ?? поскольку все потоки работают одновременно, мне нужно написать бесконечный цикл в основном потоке, постоянно проверять все потоки и быть живыми или мертвыми, а затем получать информацию от них? То, что я хотел или скорее имел в виду, было чем-то вроде уведомления основной темы. Напр. предположим, что существует 10 потоков, отличных от основного потока, все начаты в разное время и с разной продолжительностью времени. и предположим, что таймер thread_4 просто закончился, он должен уведомить главный поток о том, что время его работы. – vivek86
@ vivek86 очередь представляет собой очередь производителей-потребителей, разделяемую между всеми потоками. Рабочие потоки являются производителями - они вызывают 'q.put (timer_info)', когда заканчивается их таймер. То есть очередь - это ваш механизм уведомления. Основной поток будет иметь очень похожий цикл в однопоточном случае, который я описал, - он берет все с очереди по очереди и общается с ней. Не нужно проверять каждый поток или даже знать, сколько потоков выполняется - как только поток отправил свое уведомление через очередь, ему больше нечего делать и может выйти (если вы не используете их для повышения эффективности). – lvc