Вы можете сказать, посмотрев на страницу. Это 283 645 в секунду в сериализации JSON.
Однако это число имеет мало практического значения.
Во-первых, типичный веб-сервер выполняет такие процессы, как аутентификация пользователя, доступ к базе данных и создание HTML, поэтому время обработки намного больше. Это просто означает, что время обработки Sanic ничтожно мало.
Также не так много случаев, когда веб-приложению требуется более 1000 процессов в секунду. Во-первых, веб-сервер, такой как Niginx, может обрабатывать и кэшировать статические файлы. Если вы это сделаете, маловероятно, что внутренняя система вашей компании с 10 000 сотрудников будет обрабатывать 1000 рабочих мест в секунду.
Даже сейчас Dgango и Flask используются в основном потому, что их обычно достаточно во многих случаях. Если есть проблема, я думаю, что лучше использовать язык Go, который работает быстрее и имеет больше функций параллельной обработки, чем Sanic в Python. Обратите внимание, что это не означает, что Sanic не используется, но если число процессов в секунду становится очень большим, сам Python часто не подходит для этого процесса. ,
Просмотров : 80 раз · По запросу Масахиро Ишизука
Спасибо за ваш ответ.
> В общем, часто лучше использовать язык Go, который работает быстрее и имеет больше функций параллельной обработки, чем Sanic в Python.
> В общем, часто лучше использовать язык Go, который работает быстрее и имеет больше функций параллельной обработки, чем Sanic в Python.
Я вижу вместе
резюме
- GIL гарантирует, что многопоточность не выигрывает от многоядерности.
Если этот блог прав, и мы рассматриваем его вместе, Python - это язык программирования, который не использует преимущества многоядерных процессоров. Если вам не нужны AI (искусственный интеллект) или библиотеки машинного обучения, Go lang лучше, чем Python, но если AI (искусственный интеллект) и библиотеки машинного обучения богаты Go Go, Python Мы надеемся, что в будущем будет решена либо платформа, либо формальная поддержка многоядерных процессоров. Существует также библиотека искусственного интеллекта, машинного обучения и численного анализа, разработанная Google под названием TensorFlow for Go lang . Этот API можно использовать в Go lang, но все еще только Python может создавать и изучать модели, поэтому я надеюсь, что он будет улучшен в будущем.
Оригинальный авторWed
С точки зрения GIL это обычно не проблема, потому что тяжелая обработка может быть устранена путем написания ее на C / C ++ или использования библиотеки, написанной на C / C ++. Однако, если число операций в секунду становится очень большим, невозможно избежать коллизий при обработке и Python становится неэффективным. Поэтому я рекомендую использовать только Go. Если он небольшой, то разработка с использованием только Python не является проблемой. Для больших масштабов может потребоваться рассчитать и проверить, выдерживает ли это только Python.
Что касается машинного обучения, обучение использует много данных, чтобы сделать много вычислений. В этом отношении Python хорош в Go и не хорош в Go, поэтому Go никогда не сможет создавать и изучать модели машинного обучения.
С другой стороны, в процессе, использующем изученный результат, вычисление является легким, потому что используется только результат. Если вам приходится иметь дело с большим количеством обработки здесь, есть API для Go, потому что Go больше подходит по причинам, указанным выше.
И TesorFlow, и Go были разработаны Google, но это результат рассмотрения характеристик Python и Go, поэтому лучше думать, что он не будет унифицирован.
Показать вопрос
Представление респондентов
Это проверка чтения блога Python3.
Может быть,
В Python2 & 3 подтверждается, что он отличается от настоящих многоядерных и многопоточных программ, таких как JAVA или Go lang (язык Go), потому что это поддельные многоядерные и многопоточные.
Действительно многоядерная и многопоточная поддержка с uvloop?
Это можно сказать.
Генеральный директор Масахиро Ишизука
тел: 042-559-8638
iPhone: 070-3861-5011
Узнайте, почему Asyncio использует потоки POSIX
Была акция.
Токибито-сенсей ( id: nullpobug ) вызвал в офис, чтобы поиграть, и мы пошли к открытому коллекционеру. Я поговорил с мистером Аодагом ( id: aodag ), но я вспомнил, о чем беспокоился раньше.
Я волновалась
При подготовке презентации для учебной сессии я подготовил пример кода, который отправляет HTTP-запрос на сервер, используя asyncio и aiohttp.
импортировать aiohttp импортировать asyncio async def fetch (l, url): async с aiohttp.ClientSession (loop = l) в качестве сеанса: async с session.get (url) в качестве ответа: возвращение ожидание response.text () async def main (l, url, num): tasks = [fetch (l, url) для _ в диапазоне (num)] возврат await asyncio.gather (* задачи) если __name__ == '__main__' : loop = asyncio.get_event_loop () results = loop.run_until_complete (main (loop, 'http: // localhost: 8000' , 3 )) для r в результатах: печатать (r)
PyCharm имеет функцию для отображения «диаграммы параллелизма», и вы можете проверить движение потоков и процессов. Поведение потоков при выполнении этого кода выглядит следующим образом.
По какой-то причине появляется
concurrent.futures.ThreadPoolExecutor
. Я попытался выяснить, что было написано в документе, но так как я не смог найти таких описаний, я сдался и спросил Аодага и Токибито.
socket.getaddrinfo
Он нашел причину в десятки минут.
socket.getaddrinfo
выполняется синхронно, socket.getaddrinfo
что реализация cpython не выполняет это асинхронно, а выполняет concurrent.futures.ThreadPoolExecutor
нескольких потоках.- https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/asyncio/base_events.py#L666-L673
- https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/asyncio/base_events.py#L627-L636
Образец с использованием aioredis был подготовлен как образец кода, в котором getaddrinfo не использовался. Подключитесь к локально созданному серверу Redis с сокетом домена UNIX .
импортировать asyncio импортные async def connection_example (ключ): conn = await aioredis.create_connection ( '/tmp/redis.sock' ) return await conn.execute ( «GET» , ключ) async def main (num): tasks = [connection_example ( 'my-key' ) для _ в диапазоне (num)] возврат await asyncio.gather (* задачи) если __name__ == '__main__' : loop = asyncio.get_event_loop () результаты = loop.run_until_complete (main ( 3 )) для r в результатах: печатать (r)
Кстати, конфиг redis - это ↓.
демонизировать нет pidfile /var/run/redis.pid unixsocket /tmp/redis.sock unixsocketperm 700 файл журнала "" базы данных 1
Глядя на диаграмму параллелизма в это время,
Конечно, никакие темы не были созданы.
Доступ к внешнему серверу Redis
С другой стороны, если вы подготовите сервер Redis снаружи и подключите его (на этот раз я использовал arukas.io ),
импортировать asyncio импортные async def connection_example (ключ): conn = await aioredis.create_connection ( ( «seaof-xxx-xxx.arukascloud.io» , 311390 ), db = 0 , пароль = 'xxxxxxxxxxxxxxx' ) return await conn.execute ( «GET» , ключ) async def main (num): tasks = [connection_example ( 'my-key' ) для _ в диапазоне (num)] возврат await asyncio.gather (* задачи) если __name__ == '__main__' : loop = asyncio.get_event_loop () результаты = loop.run_until_complete (main ( 3 )) для r в результатах: печатать (r)
Когда выполняется, это происходит следующим образом.
Кажется, что рабочий поток создан в конце концов.
Сколько рабочих потоков создано для ThreadPoolExecutor?
Диаграмма параллелизма, когда количество одновременных выполнений в семафоре ограничено 3, выглядит следующим образом.
Очевидно, Thread в ThreadPoolExecutor не используется повторно. Степень, до которой это было создано, была описана в документации под ThreadPoolExecutor.
Если max_workers равен None или не указан, значением по умолчанию является количество процессоров на машине, умноженное на 5.17.4 Concurrent.futures - параллельное выполнение задачи - документация Python 3.6.1
Я отправил около 30 запросов на пробную версию (семафор 3).
Было создано до 20, и было подтверждено, что они были повторно использованы после этого. Хотя верхний предел рабочего потока не может быть изменен из-за реализации, маловероятно, что возникнут какие-либо проблемы.
uvloop
Что касается uvloop, было подтверждено, что они усердно работали без использования потоков POSIX .
импорт uvloop # Опущено loop = uvloop.new_event_loop () asyncio.set_event_loop (цикл)
Когда выполнено,
Ох, правда.
в заключении
Аодаг-сенсей и Токибито-сенсей потрясающие ... Я читал и оставлял документ влажным, но мне потребовалось десять минут, чтобы найти причину и сказать мне. Я также являюсь членом общества с завтрашнего дня, поэтому я буду усердно работать для двух человек.
Открытый коллекционер с мистером Аодагом и мистером Токибито, похоже, набирает на работу. Спасибо
0 コメント:
コメントを投稿