nikto_211, создаёшь таблицу. Точная структура таблицы зависит от задачи. У тебя таких команд может быть одна или несколько? Они привязаны к серверам, или общие для всего бота?
Если считаем что несколько, и привязаны, то структура таблицы будет иметь столбцы вроде
Идентификатор типа команды - command VARCHAR
(например, команда снятия бана, команда начисления ачивок за время на сервере и т.п.)
Идентификатор сервера - server VARCHAR
Время, когда команда должна сработать - time_to_trigger DATE
БД скорее оперируют массивами данных, а не одиночными значениями.
Иван Волков, я писал программу, которая распараллеливает вычисления через мультипроцессинг. Numpy-массивы multiprocessing не умеет сериализовать для передачи, приходится конвертировать в списки и обратно. Выигрыш всё ещё есть, впрочем.
В общем, если коротко: мультипроцессинг имеет солидный оверхед и ряд ограничений. Для реально тяжелых CPU-bound задач он имеет смысл, но если нужно просто отпараллелить небольшой кусок кода с минимальными правками - потоки в разы проще.
Иван Волков, да, примитивные типы данных и базовые коллекции можно прокинуть в процессы. Но когда речь заходит о чём-то нетипичном вроде numpy-массивов, дело усложняется.
Кроме того, не все блокирующие IO-bound задачи можно переписать на асинхронщину. Иногда имеешь дело с ситуацией, когда есть только синхронная библиотека. Например, графический интерфейс + IO-bound задача.
В таких случаях кроме потоков, вариантов остаётся немного - GUI обычно синхронный, а проброс данных через процесс не всегда удобен.
1. Оформляй код кнопкой </>
2. Код приведён не полностью. Где импорты?
3. На момент вызова telegram_send.send( messages = ut ) переменная ut не определена, отсюда и ошибка.
4. Сначала освой азы питона, потом уже бросайся решать такие задачи.
А, ну так.
str(checkname+("|")+checkinfo+("|")+checkprice) + "\n"
Что именно ты хочешь вытащить из checkname и прочего? Это же xml-элемент с именем, атрибутами и содержимым. Тебе придётся указать конкретно, что тебе от них нужно, а потом уже преобразовывать в строку.
azukizxc, ты вызовы f.read() и f.write()-то не забыл разрулить? Откуда читаем и куда пишем.
Если да, то запости новый код и пример содержимого входного файла.
Добавлю: если у тебя матрица - это список списков, то тебе нужно будет скопировать каждую строку в отдельности. Иначе у тебя будет новый внешний список, но те же самые внутренние.
NoKit, Смотри, await run_check() остановит вызывающую корутину, так как run_check() содержит бесконечный цикл (а потому никогда не вернёт значение).
Нужно сделать пару правок.
1. использовать task = asyncio.create_task(run_check()). Это позволит запустить корутину, не дожидаясь её выполнения.
2. Добавить условие прекращения цикла. Например, если сохранили task из пункта выше, можно сделать task.cancel() чтобы выкинуть внутри run_check() исключение CancelledError.
Глеб Лукашонок, можешь использовать мой вариант. Тогда всеми вопросами экранирования займётся прослойка работы с БД, и тебе не придётся помнить "а можно ли в эту функцию передавать параметры с апострофами?"
Akina, если используется литерал, то запрос можно и захардкодить без форматирования.
А если это значение откуда-то получается, то это мало чем отличается от пользовательского ввода. Не говорю уж про ситуацию, когда ранее захардкоженное значение рефакторится в пользовательский ввод без исправления способа формирования запроса.
Так что тут лучше перебдеть чем недобдеть.
По мне так есть только три сценария для ручного формирования запроса: кастомный поиск (по заранее неизвестному набору условий), кастомный порядок сортировки, и использование оператора IN со списком заранее неизвестного размера (последний случай тоже реализуется через плейсхолдеры, но без синтеза запроса не обойтись).
SKEPTIC, Я не думаю, что питон предоставляет такое апи - оно очень зависит от ОС. Но если прямо позарез нужно, можно попробовать дёрнуть из питона WinAPI, а именно SetProcessAffinityMask(). Достучаться до WinAPI вполне реально.
denislysenko, нет, я не понял о чём речь.
Максимум, что я могу поинтересоваться: если нужна переносимость программы на уровне "скопировали папку", почему используешь mysql? Почему не sqlite, который в питоне есть из коробки и хранит БД в одном файле?
denislysenko, минутку. Клиент-сервер подразумевает сетевое соединения, типа сокетов или чего-то более высокоуровневого. И потом, что будет является клиентом, а что сервером? Вы - клиент, а сторонний сервер БД - сервер? Консольная утилита - клиент, и ещё одна - сервер, связанные протоколом собственной разработки?
Уточни задание, потому что я БЕЗ ПОНЯТИЯ что от тебя хотят.
if __name__ == '__main__':
while True:
command = listen_command()
vcl.run_command(command)
Если я верно понял твой код, это должно было сработать.
Если же это не работает, проверь следующее (можно с помощью пары отладочных print):
0. Выводится ли сообщение об ошибке? Если нет, то какие симптомы? Бот просто игнорирует всё?
1. Попробуй временно заменить listen_command() на input(). Если при вводе с клавиатуры команды распознаются, дело в распознавании голоса?
2. Что лежит в vcl.actions на момент перед while True? Там должен быть список из нескольких элементов, по одному на каждую из отмеченных декоратором @vcl.on() функций.
3. Проверь цикл for внутри run_command(). Что приходит в text? Срабатывает ли хоть один раз условие if predicate()?
UMFUCHI, прочитай мои сообщения ещё раз. Внимательно. Я это уже объяснял.
---
Ну а чтобы скормить боту распознанную строку:
vcl.run_command('привет') #сюда можно подставить выхлоп распознавателя речи
---
1. Работа с распознавателем речи. run_command() принимает сказанную пользователем строку, ты должен её предоставить как параметр при вызове run_command(). По сути, vcl.run_command() - это аналог твоего do_this_command().
---
Сравни с твоим кодом
if __name__ == '__main__':
while True:
command = listen_command()
vcl.run_command() # <--- чего-то не хватает?
Если считаем что несколько, и привязаны, то структура таблицы будет иметь столбцы вроде
Идентификатор типа команды - command VARCHAR
(например, команда снятия бана, команда начисления ачивок за время на сервере и т.п.)
Идентификатор сервера - server VARCHAR
Время, когда команда должна сработать - time_to_trigger DATE
БД скорее оперируют массивами данных, а не одиночными значениями.