1. Python / Говнокод #28164

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    import asyncio
    
    async def hello():
        return "hello"
    
    async def world():
        return "world"
    
    async def comma():
        return ","
    
    async def space():
        return " "
    
    async def excl():
        return "!"
    
    async def capitalize(coro):
        return (await coro).capitalize()
    
    async def main():
        print(''.join(await asyncio.gather(*[asyncio.create_task(task) for task in (capitalize(hello()), comma(), space(), capitalize(world()), excl())])))
    
    asyncio.run(main())

    Изучаем asyncio через говнокод

    Запостил: valo94, 12 Мая 2022

    Комментарии (29) RSS

    • asyncinho
      Ответить
    • Раз уж изучаешь, то надо по этапам писать, по строчкам, а не эту длинную колбасень.
      Ответить
    • хуйня

      возьми вебсокеты, да напиши чат
      Ответить
    • Хуета.
      Если поубирать все эти async/await, то вообще нихуя не изменится. Пример не отвечает на вопрос "зачем", а это при обучении очень важно.
      Ответить
      • плюсану
        ни одного IO или sleepа
        Ответить
      • А реально, нахуя всё это говно нужно? Для c10k в вебе?
        Ответить
        • В основном -- да.

          Мы используем корутины и для c10k (не только в вебе, я и в десктопе не советовал бы создавать по 10K потоков в минуту, особвенно на винде) и чтобы не блокировать гуйный тред (но мы пишем не на питоне). У нас есть еще стракчрл канкаренси: мы умеем легко кенсльнуть все 100500 корутин (что не всегда просто сделать с потоками). Хотя в питонке тоже можно cancelнуть задачу
          Ответить
      • Стильно, модно, молодёжно!
        Ответить
    • ну покажи хотя бы как ты можешь на одном потоке независимые задачи ставить
      import asyncio
      from typing import List
      
      
      async def connect(host: str):
          reader, writer = await asyncio.open_connection(host, 80)
          writer.write(("\r\n".join(["GET / HTTP/1.0", f"Host:{host}"]) + "\r\n\r\n").encode("ASCII"))
          await writer.drain()
          response = await reader.read()
          writer.close()
          print(f"Hello from {host}: {str(response, 'UTF-8')}")
      
      
      async def chatter(name: str, sleep_time: int):
          for _ in range(10):
              print(f"I am {name}")
              await asyncio.sleep(sleep_time)
      
      
      async def loop():
          tasks: List[asyncio.Task] = [asyncio.create_task(chatter("petrushka", 1)),
                                       asyncio.create_task(chatter("popka", 3)),
                                       asyncio.create_task(connect("yandex.ru")),
                                       asyncio.create_task(connect("govnokod.ru"))]
          for task in tasks:
              await task
      
      
      asyncio.run(loop())
      Ответить
      • > tasks: List[asyncio.Task] =

        Какой уебан придумал такой синтаксис?
        Ответить
        • Добрый день.

          Такой уебанский синтаксис для вас придумали

          Guido van Rossum <guido at python.org>,
          Jukka Lehtosalo <jukka.lehtosalo at iki.fi>,
          Łukasz Langa <lukasz at python.org>

          Им помогли
          Jim Baker, Jeremy Siek, Michael Matson Vitousek, Andrey Vlasovskikh, Radomir Dopieralski, Peter Ludemann, and the BDFL-Delegate, Mark Shannon.

          -------
          Эта хуйня тут чисто поциональна, как ты понимаешь, я мог ничего там не писать
          Ответить
        • Шо не нравится? Пасцаль же.
          Ответить
          • блядь, ну если бы там было

            asyncio.Task[] tasks
            или

            asyncio.Task tasks[]

            то это был был бы повод не пользоваться питоном
            Ответить
        • Примерно в 42.178% языков такой. В чём проблема?
          Ответить
    • ну или вот лабный совсем вариант: ставишь аздачи с помощью "start", они себе конкурентно работают, а потом их можнот стопать

      тут главное не забыть поставить aioconsole
      import asyncio
      from typing import Dict
      
      from aioconsole import ainput
      
      
      async def chatter(name: str, sleep_time: int):
          while not asyncio.current_task().cancelled():
              print(f"I am {name}")
              await asyncio.sleep(sleep_time)
      
      
      async def loop():
          tasks: Dict[str, asyncio.Task] = {}
          while True:
              command = await ainput("Command: ")
              if command == "start":
                  name = await ainput("Name: ")
                  time = int(await ainput("Time: "))
                  tasks[name] = asyncio.create_task(chatter(name, time))
              elif command == "list":
                  for name in tasks.keys():
                      print(name)
              elif command == "stop":
                  name = await ainput("Name: ")
                  try:
                      tasks[name].cancel()
                      del tasks[name]
                  except KeyError:
                      pass
              else:
                  print("Go fuck your self please")
      
      
      asyncio.run(loop())
      Ответить
      • - asyncio.run(loop())
        + def main():
        +     asyncio.run(loop())
        + 
        + 
        + if __name__ == '__main__':
        +     main()

        Исправил, проверь.
        Ответить
        • да, так более питонично

          и безопасно: случайно не запустить
          Ответить
        • как люди в здравом уме могут пользоватся хуйнёй где нужны такие костыли?
          Ответить

    Добавить комментарий