Действительно, можно сделать так как вы говорите, но для решения задачи, которая перед нами стояла это не требуется
Я не понимаю, какая перед вами стояла задача и почему вы считаете текущий код решением. Вы просто не используете ровно никаких преимуществ файберов. Вы сначала приостановили код, а потом сразу же запустили опять, хотя промис газзла мог быть еще не готов к завершению. Чтобы код имел смысл, вы должны узнать, что промис завершился, и тогда вызывать Fiber::resume.
Файберы не заменяют циклы. Файберы (stackfull корутины) заменяют генераторы (stackless корутины) в способе переключения контекста. Цикл вокруг select/epoll/kqueue остается.
У вас неправильно работает Await::all. Сейчас вы просто продолжаете каждый файбер после запуска, даже если ответ на запрос еще не пришел. Смысл в Fiber::suspend и Fiber::resume в том, чтобы их вызвать в определенное время. Например, Fiber::suspend вызвать после того, как мы отправили запрос по сети, а Fiber::resume после того, как мы узнаем, например через stream_select, что ответ пришел – и мы можем продолжить корутину дальше, чтобы она могла прочитать данные из сокета.
Все очень и очень плохо. Про композер явно не слышали, проблему if/else не решили. Появится 100 команд, будете делать простыню из 100 if/else, switch/case? Одна статика во всех классах. Пытались решить полезную задачу, а код полезным не сделали.
Я с вами полностью согласен. Я к этому и веду, что питон не является самым лучшим языком в данном случае, но часто вижу, как автора бота спрашивают: «а почему не на питоне?». И все примеры ботов, которые были на питоне, были выполнены в духе if/else, а вот на джаве и пхп мне попадались очень неплохие проекты, в которых код можно было очень легко расширять, добавив в коллекцию команду, которую хэндлер сам вызовет при обращении к боту.
Какие структуры данных применяются при написании ботов? Везде одна и та же паста из if/else в любых ботах, какие я видел. Ну если в этом смысле, то да, питон лаконичнее, но я не думаю, что это преимущество языка. Это недостаток разработчиков.
«Обычно» не означает, что Python подходит лучше. Это лишь может означать, что ботов пишут в основном питонисты, не более. Нет никаких преимуществ у питона перед остальными языками в написании ботов. Вообще нет.
Я не понимаю, какая перед вами стояла задача и почему вы считаете текущий код решением. Вы просто не используете ровно никаких преимуществ файберов. Вы сначала приостановили код, а потом сразу же запустили опять, хотя промис газзла мог быть еще не готов к завершению. Чтобы код имел смысл, вы должны узнать, что промис завершился, и тогда вызывать
Fiber::resume.Файберы не заменяют циклы. Файберы (stackfull корутины) заменяют генераторы (stackless корутины) в способе переключения контекста. Цикл вокруг select/epoll/kqueue остается.
У вас неправильно работает
Await::all. Сейчас вы просто продолжаете каждый файбер после запуска, даже если ответ на запрос еще не пришел. Смысл вFiber::suspendиFiber::resumeв том, чтобы их вызвать в определенное время. Например,Fiber::suspendвызвать после того, как мы отправили запрос по сети, аFiber::resumeпосле того, как мы узнаем, например черезstream_select, что ответ пришел – и мы можем продолжить корутину дальше, чтобы она могла прочитать данные из сокета.revolt/event-loop, amphp/{http-client, http-server, mysql, postgres, redis}, thesis/{amqp, nats}.
Похоже на ответ chatgpt, как и вся статья.
public function register(string $event): self;Красота.
Кто-нибудь скажет автору о различиях компилируемых языков от интерпретируемых?
Что вы собрались там копировать, тексты ошибок? Чтобы что?
Если бы вы оставили только этот аргумент, комментарий был бы куда полезнее.
Храните последнюю команду в базе.
С каким контекстом?