А это не спор, но затейливое подтверждение теории об умирающих языках. Автор паскаля позиционировал как аналог си, а по питону никто так вопрос не ставит.
Там нет особой разницы с аиохттп. На мой взгляд, надо избегать ситуации когда один асинк запрос ждет результат другого. AsyncIO где IO это ввод/вывод, во там и польза от него.
Кстати, забавный пример: Есть файл со списком запросов на создание таблиц, индексов и прочих. Все по порядку, сначала таблица, потом запчасти для нее. До этого psycord, а тут asyncpg под рукой оказался. Стандартно
async with self.pool.acquire() as conn: stmt = await conn.prepare(sql) async with conn.transaction(): if len(data) > 0 and isinstance(data[0], (list, tuple)): for args in data: async for row in stmt.cursor(*args): up_result(row) ....
Уууппс. Что то типа ОШИБКА: отношение "......" не существует. Смотрю в файл, все норм. Потом допер - асинхронка, создание индекса запустилось раньше чем создана его таблица. Хотя в файле все по порядку...
По моему, очень наглядный пример.
Скрин больше как пример того, что с одной стороны все просто, но есть детали..
request.state.tpl_file файл шаблона, типа того:
<!doctype html><html lang="{{ content.lang }}" class="no-js"><head> <title>{{ content.title }}</title> <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" /> <meta charset="utf-8"> <meta name="description" content="{{ content.description }}"> {% block head %}{% endblock %} <style> {% block root_css %}{% endblock %} {% include 'sys/dist/css/css.css' %} {% block custom_css %}{% endblock %} </style> {{ meta.header_links }} {{ meta.head_meta }} {% block head_ext %}{% endblock %}</head><body> <header>{% block header %}{% endblock %}</header> {% block slider %}{% endblock %} <main> {{ content.breadcrumb }} {% block attention %}{% endblock %} {% block article %}{% endblock %} {% block hits_main %}{% endblock %} {% block aside %}{% endblock %} {% block related %}{% endblock %} </main> {% block hits_bottom %}{% endblock %} <footer>{% block footer %}{% endblock %}</footer> {% block sys_elements %}{% endblock %} <script> const baseHost = "{{content.scheme}}://{{ content.base_host }}", cdnHost = "//{{ content.cdn_host }}", subDomain = '{{ content.sub }}', realURL = '{{ content.url }}', app = { is_ready: null }, siteId = "{{ site_id }}", pageId = "{{ content.page_id }}"; {{ content.start_js_code }} {% include 'sys/dist/index.js' %} {% block custom_js %}{% endblock %} </script></body></html>
Тут писали о сложности запуска сайта на питоне, но нет:
# запуск, $ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8090# или типа того$ ln -s /home/py39a/amtl/amtl_app.service /etc/systemd/system/amtl_app.service$ systemctl start amtl_app$ systemctl enable amtl_app# amtl_app.service [Unit]Description=Gunicorn Daemon for FastAPI ApplicationAfter=network.target[Service]User=wwwGroup=wwwWorkingDirectory=/home/py39a/amtlExecStart=/home/py39a/bin/gunicorn -c guniconf.py main:appRestart=on-failure[Install]WantedBy=multi-user.target#NGINXupstream latest_app { server 0.0.0.0:8090 fail_timeout=0;}
По мне, так проще некуда)
Когда то, давно. Лет 30 назад. Попал я на курсы по паскалю. Там препод часто фразу повторял, что, по словам разработчиков, на паскале можно сделать все то, что можно на си. И продолжал - "Правда, компилятор паскаля сделан на си"
tp 5, 6 нет нигде 😀 С одной стороны теория про умирающие языки верна, но..
Мы в рамках темы "Сопоставим ли PHP с Python по возможностям?"
Каков ответ? Я думаю, скорее нет, чем да. Чаще сделать питоном проще, да и сделано там больше. Я долго переходил с пыха, но pymorphy2 (очень надо) + aiohttp. Правда, сейчас fastapi вместо aiohttp.
Это, к тому, что уже сделано кем то. Очевидно, что качественного опенсорса на питоне существенно больше количественно. С пыхом, костылями майстем а тут все под рукой.
Это, да.
$__URL = 'http://4.lcl/1c?';$steps = [ 'type=catalog&mode=checkauth', 'type=catalog&mode=init', #'type=catalog&mode=file&filename=ajax.php', #'type=catalog&mode=file&filename=import_files/d9/d9ry559.jpg', #'type=catalog&mode=file&filename=1/offers.xml', #'type=catalog&mode=file&filename=1/import.xml', #'type=catalog&mode=file&filename=1cbitrix.zip', #'type=catalog&mode=file&filename=import.zip', 'type=catalog&mode=file&filename=v8_3a67_1d12.zip', 'type=catalog&mode=import&filename=import.xml', 'type=catalog&mode=import&filename=offers.xml',
Эмулятор обмена с 1с. До сих пор на пыхе. Лет 10 уже.
Для начала сломается (Print != print, кавычки), потом, после исправления, 80 раз напечатает "-".
Странно.
from asyncio import runfrom motor.motor_asyncio import AsyncIOMotorClientfrom time import timeasync def m(mongodsn): dbname=mongodsn.split('/')[-1] client=AsyncIOMotorClient(mongodsn) db=client[dbname] server = await client.server_info() print('server version', server['version']) ''' await db.drop_collection("tc") t0 = time() result = await db.tc.insert_many( [{'_id': f"id{i}", 'a': i, 'b': {'c': f'aaa{i}'}} for i in range(2000000)]) print(f'inserted {len(result.inserted_ids)} docs, time {(time()-t0):.4f} s') await db.tc.create_index("a") await db.tc.create_index("b.c") ''' print('Index info:', await db.tc.index_information()) t0 = time() cnt = await db.tc.count_documents({}) print(f'\nCount all docs: {cnt}, timing: {(time()-t0):.4f} s') f = {'a': {'$gt': 1990000}} t0 = time() cnt = await db.tc.count_documents(f) print(f'\nCount docs by filter ({f}): {cnt}, timing: {(time()-t0):.4f} s') t0 = time() cursor = db.tc.find(f) cursor.sort('a', 1).skip(2).limit(3) res = [] async for doc in cursor: res.append(doc) print(f'\nfind by filter ({f}) timing: {(time()-t0):.4f} s') print(res) f = {'b.c': "aaa1999999"} t0 = time() doc = await db.tc.find_one(f) print(f'\nfind_one by filter ({f}) timing: {(time()-t0):.4f} s') print(doc) t0 = time() f = {"b.c": {"$regex": f"^aaa17878"}} cursor = db.tc.find(f).limit(3) res = [] async for doc in cursor: res.append(doc) print('\nRes:', res, sep="\n") print(f'find_one by filter ({f}) ({len(res)}) timing: {(time()-t0):.4f} s') if __name__ == "__main__": import os run(m(os.getenv('AMTL_MONGODSN')))
10 минут на опровержение. Фуллтекст не стал делать, в 10 минутный лимит не влезть. 2-й запуск на скрине с закоменчеными строками заливки и создания индексов. Полсекунды только count_documents, всех 2 млн. Остальное вполне приемлемо.
Кстати,
(py39a) [www@localhost ~]$ wrk -c 500 https://accessories.ford.com/ Running 10s test @ https://accessories.ford.com 2 threads and 500 connections Thread Stats Avg Stdev Max +/- Stdev Latency 269.66ms 232.65ms 2.00s 89.79% Req/Sec 0.91k 168.08 1.32k 77.27% 18028 requests in 10.02s, 104.30MB read Socket errors: connect 0, read 0, write 0, timeout 86 Non-2xx or 3xx responses: 18028 Requests/sec: 1800.05 Transfer/sec: 10.41MB
vs
(py39a) [www@localhost ~]$ wrk -c 500 -H "user-agent: Mozila qqqq" https://accessories.ford.com/ Running 10s test @ https://accessories.ford.com/ 2 threads and 500 connections Thread Stats Avg Stdev Max +/- Stdev Latency 1.39s 349.45ms 1.98s 65.08% Req/Sec 24.45 15.20 80.00 69.86% 382 requests in 10.01s, 103.09MB read Socket errors: connect 0, read 0, write 0, timeout 319 Requests/sec: 38.16 Transfer/sec: 10.30MB
Non-2xx or 3xx
Грамотно, но мб примерно одинаково отдали. Видимо 404/... по объему сопоставима.
--------------------------------------------
Тихонько поворачиваемся к веб строительству. И начинаем формировать понимание заказчика про ТЗ/бюджет
Там, скорее всего, какой то раздел сайта/где то на другом домене, но в инфраструктуре валмарта.
Вроде https://accessories.ford.com/ (который первый по вашей ссылке): Top 10 companies using Magento, а форд.ком, скорее всего, на чем то другом. Иначе, просто бы написали форд.ком наш.
://accessories, кстати, предполагает более менее ассортимент и вариабельность его, в отличии от собственно машинок. Выбор магенты, если это она, что то значит.
Нравится. На моем хозяйстве FastAPI чуть лучше тесты по скорости/ресурсам дает, поэтому тихонько перевожу все. А так - идеология то примерно одна и та же, какие то вещи вообще один к одному переезжали, ну пара правок может. Правда, в новых реалиях, не ясны перспективы хозяйства, но хотя бы FastAPI освоил.
Вначале, как то скептически на pydantic смотрел, а сейчас втянулся в ряды поклонников. При прочих плюсах/минусах к системности, что ли какой приучает.
Не аргумент.
С функционалом - там не скажу, а уж без оного, там с большим отрывом;)
Категорически согласен
------
По теме: Где то, есть какая то инфраструктура. Пока, она работает. До тех пор, пока не появится то, что то дает лучший результат. Сейчас, 100%, фреймворки рулят. Уж не знаю, насколько Битрикс фреймворк;). Но, оперировать объектами app, request и response, как правило, очень просто. Все задается предложением, есть адекватное и сайты с хтмл и самописов в массе уехали на ВП. Потом, другие. Хз, что там завтра будет.
-------
Фреймфорк и дорогой разработчик. Чушь. Сегодня, может быть, а может нет. Завтра, с учетом док и простоты точно нет
https://fastapi.tiangolo.com
https://docs.aiohttp.org/en/stable/web.html
в пыхе, сейчас не копенгаген, но с ларавеля и прочих yii2, в свое время, для свои самописов, кучу решений стырил. Так что и там доки и код любому доступен)
Про фронт вообще ни слова не сказал. В обоих параллельных темах только про бек. Правда слегка запутался, тут я за бд, или за хардкор - все на файлах и роутер в 50 строк😁
😀