Pull to refresh
26
0
Илья Чистяков @MyGodIsHe

Developer

Send message

Пока что у меня нет планов развивать проект. Вроде бы ясно об этом написал в статье. А так чтоб можно было написать что угодно, язык должен быть полным по тюрингу.

Таких решений много. Все таки это не языки программирования, а прикладные контрукторы. На них нельзя писать проивзольные программы.

Для нейронок и шейдеров такое давно есть.

Ещё есть игра Dreams. Но там похожие проблемы что и с Blueprint.

Изучал. Это неудачный пример. Все что существует удачного я привел в статье. ¯\_(ツ)_/¯

Парсер сурсов написан на ANTLR, в нем нужно разбираться. И хорошо понимать работу с графами. Нужно понимать как перестроить дерево для сворачивания и разворачивания подпространства.

Нужно глубоко погружаться в математику проекта, а это мало кто может за небольшие деньги.

Есть замеры по оверхеду?
В тиктоке бывает хорошая реклама, правда это не про веб, тут куда лучше понимание потребностей человека.
Возможно, высказывания Дурова негативно влияют на бизнес Виктории.
Можно ещё сильнее обобщить:
Заголовок спойлера
from dataclasses import dataclass, field
from typing import Any, Callable, Awaitable, List

import aiohttp
import asyncio


class TreeMapper:
    def __init__(
            self,
            create: Callable[[Any], Awaitable[Any]],
            get_children: Callable[[Any], List[Any]],
            set_children: Callable[[Any, List[Any]], None],
    ):
        self.create = create
        self.get_children = get_children
        self.set_children = set_children

    async def map(self, node):
        new_node, new_children = await asyncio.gather(
            self.create(node),
            asyncio.gather(*[
                self.map(child)
                for child in self.get_children(node)
            ]),
        )
        self.set_children(new_node, new_children)
        return new_node


@dataclass
class IdNode:
    id: int
    children: list = field(default_factory=list)


@dataclass
class TitleNode:
    title: str
    children: list = field(default_factory=list)

    def __str__(self, indentation=""):
        title = f"{indentation}{self.title}"
        children = [
            child.__str__(indentation + '\t') for child in self.children
        ]
        return '\n'.join([title, *children])


async def get_title_by_id(node: IdNode, session):
    response = await session.get(
        f"https://jsonplaceholder.typicode.com/todos/{node.id}"
    )
    data = await response.json()
    return TitleNode(title=data['title'])


async def main():
    async with aiohttp.ClientSession() as session:
        message_tree = await TreeMapper(
            lambda node: get_title_by_id(node, session),
            lambda node: node.children,
            lambda node, children: node.children.extend(children),
        ).map(
            IdNode(1, [IdNode(2), IdNode(3, [IdNode(4), IdNode(5)])]),
        )
        print('\n', message_tree)


if __name__ == '__main__':
    asyncio.run(main())

Выглядит довольно неприятно и бессмысленно. Однострочные абстракции очень спорная штука.

Мне больше такой стиль нравится:
Заголовок спойлера
from dataclasses import dataclass, field

import aiohttp
import asyncio


@dataclass
class IdNode:
    id: int
    children: list = field(default_factory=list)


async def get_data_by_id(node: IdNode, session):
    response = await session.get(
        f"https://jsonplaceholder.typicode.com/todos/{node.id}"
    )
    data = await response.json()
    return data


def tree_iter(node, get_children, lvl=0):
    yield node, lvl
    for child in get_children(node):
        yield from tree_iter(child, get_children, lvl + 1)


async def main():
    async with aiohttp.ClientSession() as session:
        id_tree = (
            IdNode(1, [
                IdNode(2),
                IdNode(3, [
                    IdNode(4),
                    IdNode(5)
                ])
            ])
        )
        nodes, lvls = zip(*tree_iter(id_tree, lambda node: node.children))
        nodes = await asyncio.gather(*[
            get_data_by_id(node, session)
            for node in nodes
        ])
        for node, lvl in zip(nodes, lvls):
            print('{}{}'.format('\t'*lvl, node['title']))


if __name__ == '__main__':
    asyncio.run(main())



С опозданием на пару месяцев)
Может стоит удалить поддержку второго питона и не парится больше?
Спасибо за предложение. Как вы видите подстановку едениц измерения?

Ещё думаю добавить временную шкалу.
Поправил. Теперь не должен падать. Но как выйти при поломке пайпа в py3 пока не придумал. Сейчас он висит и ждёт ввода.
Вторая и третья версия по разному обрабатывают отсутствие данных в пайпе. Второй питон генерит ошибку Resource temporarily unavailable, третий отдаёт пустую строку. При том если пайп закрывается, второй и третий отдаёт пустую строку.
Проверил. Во втором питоне работает, а в третьем выходит после первой отрисовки. Буду чинить. Спасибо за сообщение!
можно подробней? какая ось? какая команда? какая ошибка?
Даже без знания плюсов, но со знанием лени, в голову сразу приходит вариант с 1, 1.
Зачем? numpy внешняя либа, пусть и в крестах так будет.
Дело не только в быстроте, асинхронное приложение более устойчиво к пиковым нагрузкам и равномерно распределяет нагрузку. Flask же работает через воркеры, их фиксированное число — столько приложение может обработать одновременных подключений, остальным придётся подождать в очереди.

Я же порекомендую связку aiohttp + jsonschema (для валидации схем в openapi) + iko (асинхронный аналог Marshmallow).

Замечу что асинхронный код писать сложнее, и нет устоявшихся решений для restapi.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity