Это видео недоступно.
Сожалеем об этом.

How To Easily Do Asynchronous Programming With Asyncio In Python

Поделиться
HTML-код
  • Опубликовано: 1 авг 2024
  • Learn about asynchronous programming in this tutorial where I explain the basics of async and await in Python and show you how you can run programs in parallel (well... kinda).
    The code I worked on in this video is available here: github.com/ArjanCodes/2021-as....
    💡 Here's my FREE 7-step guide to help you consistently design great software: arjancodes.com/designguide.
    🎓 Courses:
    The Software Designer Mindset: www.arjancodes.com/mindset
    The Software Designer Mindset Team Packages: www.arjancodes.com/sas
    The Software Architect Mindset: Pre-register now! www.arjancodes.com/architect
    Next Level Python: Become a Python Expert: www.arjancodes.com/next-level...
    The 30-Day Design Challenge: www.arjancodes.com/30ddc
    🛒 GEAR & RECOMMENDED BOOKS: kit.co/arjancodes.
    🚀If you want to take a quantum leap in your software development career, check out my course The Software Design Mindset: www.arjancodes.com/mindset.
    💬 Discord: discord.arjan.codes
    🐦Twitter: / arjancodes
    🌍LinkedIn: / arjancodes
    🕵Facebook: / arjancodes
    👀 Code reviewers:
    - Yoriz
    - Ryan Laursen
    - Sybren A. Stüvel
    - Dale Hagglund
    🔖 Chapters:
    0:00 Intro
    0:48 Explaining the example
    3:13 Threads, processes vs. asynchronous
    6:09 Changing the example to the asynchronous model
    12:07 Adding parallelism to the example
    16:33 Gaining more control over parallel vs sequential execution
    22:01 Final thoughts
    #arjancodes #softwaredesign #python
    DISCLAIMER - The links in this description might be affiliate links. If you purchase a product or service through one of those links, I may receive a small commission. There is no additional charge to you. Thanks for supporting my channel so I can continue to provide you with free content each week!

Комментарии • 330

  • @ArjanCodes
    @ArjanCodes  9 месяцев назад

    💡Here's my FREE 7-step guide to help you consistently design great software: arjancodes.com/designguide.

  • @mauricepasternak6504
    @mauricepasternak6504 2 года назад +207

    There is not a lot of material on queues, locks, etc. with asyncio on RUclips. Certainly none showcased with using Python 3.10. I think a lot of people will benefit from seeing those synchronization primitives in use.
    Loved the use of the sequential and "parallel" wrappers in this video. Very clean and readable.

    • @ArjanCodes
      @ArjanCodes  2 года назад +14

      Thanks Maurice, glad you enjoyed it!

    • @khunjohn1054
      @khunjohn1054 2 года назад +4

      @@ArjanCodes Great video. The use of semaphore to control the number of "threads" is an important concept in asyncio, if you decide to make a longer video about it.

    • @ondskabenselv
      @ondskabenselv 2 года назад

      ​@@ArjanCodes A quick question about that: why isn't the functions called in the sequential for loop (18:02)? It seems like the function, or callable objects, are just declared to be awaited, but newer invoked (adding a parenthesis after the name). Can you explain that I'm misunderstanding here?
      P. S.: Thanks for the video, it's one of the best I've seen on the topic!

    • @AndreyPutilov
      @AndreyPutilov 2 года назад +1

      @@ondskabenselv I am a newbie in python but I guess arguments are not functions, or references to functions, they are "awaitables", something like "promises" in js. I think it's a result of async function, but it's not a final result but a proxy object that keeps information on how long does it take to wait until it is ready. The result of async function is that medium object, and such objects, called "awaitables" are passed, not function references. That's why we don't have to call it and add parenthesis.

    • @UTJK.
      @UTJK. 2 года назад

      I followed another tutorial from him... his content is extremely detailed and well explained.

  • @SaintMyles
    @SaintMyles 2 года назад +114

    Wow! Finally async makes sense to me. I've been trying to learn about it, but it just wouldn't click with any other video/article. This was the one that finally got me to understand it enough to use it. Thank you so much! I definitely would be interested in seeing you dive more into async and see what can be possible with it.

    • @ArjanCodes
      @ArjanCodes  2 года назад +8

      Thanks, glad to hear it was helpful!

  • @ThePaulWilliams
    @ThePaulWilliams 2 года назад +52

    Here's another vote for more on async. I enjoy your approach to explaining things and using examples. Very helpful. Keep up the great work, Arjan!

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      Thank you and will do, Paul!

  • @murghay01
    @murghay01 2 года назад +83

    Would DEFINITELY appreciate it if you did follow-ups to asyncio. Maybe even one on threading.
    Also, I am very, very thankful for your channel. When I first found your channel I was a lone developer at a company that did not have the guidance of a senior engineer. I knew quite a lot but my fundamentals were horrendous even though I had the breadth of knowledge. I was looking for a job because I knew I was lacking in depth and wanted to find a place where I could grow my ability. I began using your techniques in my take-home assessments and ultimately landed a job as a mid-level and it is 100000000000% because of you. I do watch your channel less because I'm learning a lot from the new company, and it's also in blockchain and that's another topic I'm learning a lot about as well. Anyway, wanted to say You're great and I can't believe you already have 50,000+ subscribers in less than a year. Great stuff. They use asyncio and some threading, so for old times sake...teach me. :)
    Merry Christmas and hope you have a happy new year.

    • @ArjanCodes
      @ArjanCodes  2 года назад +5

      Hi Gamal, that’s amazing! I’m so happy for you that you were able to make such a meaningful move in your career. I feel honored that my videos have helped you get there. Have a great holiday as well, and feel free to come back for more videos any time ;).

    • @incremental_failure
      @incremental_failure Год назад

      Threads are a very complex and wide subject, not to mention there's many methods of implementation - multiprocessing, QThreads for Qt etc.

    • @anselemokeke1143
      @anselemokeke1143 Год назад

      @@ArjanCodes great and impressive content. Please make more videos on python asyncio or even a project on it

  • @beauremus
    @beauremus 2 года назад +36

    Excellent explanation! Thanks.
    I'd love more async content. It's hard for many to understand and I think this is helpful.

    • @ArjanCodes
      @ArjanCodes  2 года назад +6

      Thank you Beau. There's more to come!

  • @mihaimyh99
    @mihaimyh99 2 года назад +20

    I would be super interested on a follow-up video on async queues and processes.

  • @kevinwork7181
    @kevinwork7181 Месяц назад

    It’s been said a lot, but I’m just going to reiterate that this is the video which finally made async click!
    I couldn’t understand when or how to use the “gather” function, nor what it really does. You are the only one that realized how helpful & instructional it would be to show a full code still works synchronously when you have “await” everywhere, and that the “gather” function works by “gathering” all those awaits into a single call. This is what finally bridged the gap for me.
    I really appreciate all your content and think your videos have done the most to improve my skills in the past 4 months!

  • @anthonyarmour1812
    @anthonyarmour1812 2 года назад +2

    This is my absolute favorite channel when it comes to coding tips... Everything is fantastic. So glad I found it this week

  • @JohnMatthew1
    @JohnMatthew1 Год назад

    Always love your videos, from start to finish you cover the topic thoroughly. Thank you.

  • @roccobrandi6344
    @roccobrandi6344 2 года назад

    amazing! I have seen a lot of videos on youtube about asyncio, this is the best, clearest explanation I have seen!

  • @presstv
    @presstv 2 года назад +1

    I enjoyed the video a lot. thanks Arjan🙂 We really needed someone like you in Python community to produce such crucial contents of software design architecture

  • @ThePramillionaire
    @ThePramillionaire 2 года назад

    Thank you so much Arjan! I had requested a video on asyncio a few months back. This was a great intro that helped me understand how to implement it.

  • @djl3009
    @djl3009 2 года назад

    Yes please, more on asyncio with streams and queues! This was another great video -- really like the gradual build up of the examples to effectively highlight the underlying concepts.

  • @caiovital325
    @caiovital325 2 года назад +16

    Who wants follow up?? 🤚🤚🤚

  • @josec.masson4847
    @josec.masson4847 2 года назад

    Wonderful video Arjan!!

  • @legion_prex3650
    @legion_prex3650 2 года назад

    Hi Arjan, this is by far the BEST python channel on youtube. I really love you videos. thank you so much for sharing your knowledge!

    • @ArjanCodes
      @ArjanCodes  2 года назад

      Thank you so much, glad you like the videos!

  • @pranabsg
    @pranabsg 2 года назад

    Thanks Arjan for hearing me out and creating the video (I requested for asyncio through one of my comment 7-8 months back, I think in some exception handling video:)).
    There are lots of materials on asyncio, but this one is the best and single place to have all information to handle asyncio in Pythonic way. Appreciate it.

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      Glad to hear you liked it! Indeed, you were one of the commenters mentioning this. If you have other great suggestions, do let me know ;).

  • @n5eg
    @n5eg 2 года назад +10

    This is an outstanding Video ! Thank you putting it all together. More than just explaining async, the helper functions really tie it all together.

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      Thank you Tom, glad you liked it!

  • @user-mt8bz6tq5o
    @user-mt8bz6tq5o 2 года назад

    Great video as always Arjan, keep up the good work!!

  • @SoWhatsAgain
    @SoWhatsAgain 2 года назад

    Thank you for the video, just in time:) I've got some libs I thought about of couple times to convert them to async, you just encouraged me to do so, I didn't realize that such conversion could be so simple

  • @ptyspawnbinbash
    @ptyspawnbinbash 2 года назад

    This was the best asyncio video I have seen. Looking forward to that follow-up video. :)

  • @RealMineManUK
    @RealMineManUK Год назад +1

    Thank you for the great content, that helps thousands of people, including me, understand complex subjects in a spare time

  • @burakcelik3752
    @burakcelik3752 2 года назад

    A Very high quality guide as always. I think even most of people explaining cooperative multitasking don't have a comprehensive knowledge of field and barely know why they do something but just talking about boilerplate examples. Therefore please go on with more advanced approaches about the topic. That would be a real treasure.

  • @draufunddran
    @draufunddran 2 года назад +2

    This is the best Video on Python asyncio i have ever Seen. And i have Seen a Lot of them trying to understand this topic. You are a Genius Arjan. Finally i think i understand it. Keep the Videos in this topic coming, since i believe there is a lot more to learn.

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      Wow, thanks Florian! Glad the video was helpful.

  • @urbansotensek4996
    @urbansotensek4996 2 года назад +1

    Loving the light humor that's in always present somewhere in your videos.

  • @aravindhm1068
    @aravindhm1068 2 года назад

    Brilliant, clear and concise.

  • @kevinw6237
    @kevinw6237 2 года назад

    Thank you sooooooooooooooooo much. Your videos always make me wonder why hundreds of books and tutorials and online articles I've read just cannot explain things clearly... Anyway... best wishes for you continuing creating awesome content

  • @jupyter5k647
    @jupyter5k647 2 года назад

    Really helped clear some confusions I had about async programming 👍keep up the awesome videos

  • @RutNij
    @RutNij 2 года назад

    Hoi Arjen, super goede tutorial over asyncio. Veel van geleerd wat direct toepasbaar is voor mijn dagelijks werk. Ben zeker geïnteresseerd in een follow-up. Dank voor het delen van jouw kennis en kunde!!

  • @gurudattv9567
    @gurudattv9567 2 года назад

    nice tutorial. thanks for posting this. this was crisp and clear.

  • @jeanchindeko5477
    @jeanchindeko5477 2 года назад

    Awesome, many thanks for that video. It will be very nice to follow up video with some more advance features of asyncio

  • @marioluizbernardinelli2659
    @marioluizbernardinelli2659 2 года назад

    Wow! This video is awesome! Thank you for sharing your knowledge it with us.

  • @GeinponemYT
    @GeinponemYT 2 года назад

    I'm a bit late to the party, but this video actually made more sense to me than any other asyncio video/tutorial I've seen. Love the run_sequence vs run_parallel implementation, really helps differentiate between the two ways of running code.

  • @meh.7539
    @meh.7539 2 года назад

    I'd love more asyncio content. Identifying parts of the code to convert to ansyncio, how, why, where, etc, would be really helpful for me, personally.
    Thanks again for the quality content!

  • @cellisisimo
    @cellisisimo 2 года назад

    Great asyncio introduction!! Looking forward to the follow up video 😊

  • @ronaldokun
    @ronaldokun Год назад +1

    I usually don't like "toy" examples, but you've made it so much sense with this one and clarified a somewhat obscure topic in python that now I see the value in them. Thank you!

  • @andreasvaldma8428
    @andreasvaldma8428 2 года назад +1

    The last speaker sequence you added:
    Turn on and play music
    You had the switch off speaker call also in that run_parallel call so it is possible for the switch off to run after the turn on call or before it.

  • @robertbrummayer4908
    @robertbrummayer4908 2 года назад

    Great video, Arjan. I would be interested in more videos about this topic.

  • @peteawest
    @peteawest 2 года назад +2

    I got a lot out of this tutorial. Please keep going with the async series! Bravo

  • @chriswunder5420
    @chriswunder5420 Год назад

    Great Content, thanks so much for the video. I'll be using this for setting up parallel command executions in my UI.
    I definitely want to see the follow up about other details of aysncio!

  • @Mr21666
    @Mr21666 2 года назад

    Thanks for the video! Now python async/await is much more clear to me!

  • @AndreyPutilov
    @AndreyPutilov 2 года назад

    Watched two of your videos, on dataclass in python and this asyncio in python. Both are awesome, super, educating and helpful, concise, and do well describe the topic. Usually I prefer articles in text just because it's faster to read. But these videos are just great. No wasted time. Thank you, will continue watching.

    • @AndreyPutilov
      @AndreyPutilov 2 года назад

      Also, I expected you create a "compound" message so that these actions can still be passed as a structure, something like those "program" veriables defined at the top.

  • @albertsikkema8217
    @albertsikkema8217 2 года назад

    I was just about to start reading up on asyncio today and just ran into this video (the only one on your channel I haven't watched): Thanks Arjan!

    • @ArjanCodes
      @ArjanCodes  2 года назад

      You're welcome, Albert! This Friday, there'll be another video you haven't watched yet ;).

  • @santoshbhattarai3275
    @santoshbhattarai3275 2 года назад

    I love the way how you show it first and then optimize it. Penetrates through the head.

  • @joaovictorpereirarocha33
    @joaovictorpereirarocha33 2 года назад

    After a couple of tutorials, async makes sense to me with. Thanks a lot, Arjan!

    • @ArjanCodes
      @ArjanCodes  2 года назад

      Happy to hear you found it helpful!

  • @user-ff8pg1fe9f
    @user-ff8pg1fe9f 2 года назад

    Thank you! Very interesting and informative!

  • @martincronje5242
    @martincronje5242 2 года назад

    Thanks for the video. Loved the simplicity with which this was explained. Would love to see async and streaming video.

  • @sebastiencanart7423
    @sebastiencanart7423 2 года назад +2

    I was looking at asyncio a few days ago to improve an internal application at work, and this video was published the same day! I really liked the way you have presented it and I would really like a follow-up video on more advanced async topic.
    Thanks you for your videos, they are always interesting!!

  • @okoeroo
    @okoeroo 2 года назад

    One of the cleanest explinations.

  • @douglaszickuhr438
    @douglaszickuhr438 2 года назад

    What an amazing explanation Arjan. Thank you so much!

    • @ArjanCodes
      @ArjanCodes  2 года назад

      Thank you Douglas, glad you liked it!

  • @paulorugal
    @paulorugal 2 года назад

    Your approach to conveying knowledge is on spot!
    Could you make some video covering "paralellism" with multiprocessing and how to scale it up? Maybe touching containers or clouds?
    Great content and thank you for such videos!

  • @python360
    @python360 2 года назад

    Congrats on 100k - well played sir !

  • @chriscranston6117
    @chriscranston6117 Год назад

    Outstanding video mate, thanks for that :)

  • @chriskapoutselis7281
    @chriskapoutselis7281 2 года назад +1

    Small tip for VSC, if you want to write something across multiple lines you can use multiple cursors by holding ALT and clicking on the spot of the line you wish to write. Love your vids by the way

  • @noiseless2
    @noiseless2 2 года назад

    Thanks Arjan. Good introduction on asyncio. We definitely need more videos on this topic. Maybe doing error handling with monads :-) ?

  • @cosmicblack
    @cosmicblack 2 года назад

    new subscriber...really the best video to understand asyncio. Thanks!!! :)

  • @incremental_failure
    @incremental_failure Год назад

    Asyncio is amazing. Incredibly practical when you have complex synchronous code and now need to run certain functions asynchronously.

  • @statingtheobviousify
    @statingtheobviousify 2 года назад

    Thank you so much for this clear and practical explanation! It's really helped things to click for me.

  • @HeadCodeMonkey82
    @HeadCodeMonkey82 2 года назад

    Really well presented with good explanations.

  • @RS-tx4bu
    @RS-tx4bu 2 года назад

    Hi Arjan. Excellent video. Brilliant concept of sequential and parallel operations working in unison. Thanks for your time and efforts. Please make the follow up video about Async streams, subprocesses, etc. and if possible, would love to see a video with your take on Async with HTTP requests.

  • @dorukhansergin9831
    @dorukhansergin9831 2 года назад

    That last bit when you introduce helpers and enforce synchronous when you want to is what differentiates this tutorial from others. Because it’s super important to prevent race conditions in practice. Great work! (P.S.: The word parallel is IMO misleading because it’s just asyn but it’s not parallel but I can see why you chose that for the purpose of this video)

  • @aldrickdev
    @aldrickdev 2 года назад

    Great Video!! I'd definitely would love to see more on this topic. I've seen other videos that use tasks and other stuff from the asyncio library. Your approach if much more understandable.

  • @susmitvengurlekar
    @susmitvengurlekar 2 года назад +1

    Thanks a lot ! Now I am going to use this knowledge to pararelly merge (average use case: 12 with base data) dataframes based on various conditions ! to speed things up ! You gave me confidence to wander into this unexplored territory !!

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      You’re welcome and good luck - sounds challenging, so let me know how it goes!

  • @marcinkrezel3640
    @marcinkrezel3640 2 года назад

    Arjan! You’re the best.

  • @voinywolnyprod3046
    @voinywolnyprod3046 2 года назад

    Very detailed and accurate explanation of threads VS asyncio !
    It would be interesting to watch some video devoted to queues with Kafka, Redis

  • @random_act
    @random_act 8 месяцев назад

    absolutely amazing explanation as well as selected example

    • @ArjanCodes
      @ArjanCodes  8 месяцев назад

      Thank you for the kind words! Glad I was able to help.

  • @86Saurabh1
    @86Saurabh1 2 года назад

    As usual great video. Here is another vote for follow up on Asyncio.

  • @AceofSpades5757
    @AceofSpades5757 2 года назад

    I've seen a lot of asyncio vids and this was great!

  • @IgorRibeiroBraga
    @IgorRibeiroBraga 2 года назад

    It's a very professional video class... Congratulations!!

    • @ArjanCodes
      @ArjanCodes  2 года назад

      Thank you, glad you liked it!

  • @thunderbolt997
    @thunderbolt997 2 года назад

    Finally a good tutorial on asyncio!
    It finally clicked for me.

    • @ArjanCodes
      @ArjanCodes  2 года назад

      Glad to hear you liked it!

  • @golammuhaimeen2825
    @golammuhaimeen2825 2 года назад

    this is a really great video Arjan! Loved it. Thanks so much!

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      Thanks, glad you liked it!

    • @golammuhaimeen2825
      @golammuhaimeen2825 2 года назад

      @@ArjanCodes if you haven't already can you do a video on GraphQL (graphene) and Unit Testing? Would love to see that!

  • @ahmedlv5499
    @ahmedlv5499 2 года назад +1

    yes please dive more into asyncio

  • @dmytrokorbanytskyi1586
    @dmytrokorbanytskyi1586 2 года назад

    Thanks! I'm 'await' for more videos about async ))

  • @valerieshelgunova7514
    @valerieshelgunova7514 2 года назад

    thank you!! actually helpful

  • @antonijamiokowski6474
    @antonijamiokowski6474 2 года назад +1

    Great video Arjan! Please make more videos abour the asynchio

  • @nikhilistt
    @nikhilistt 2 года назад

    Great video! Please do more videos about asyncio, specially stuff like ensure_future etc.

  • @astronemir
    @astronemir 2 года назад

    This was really good, thanks. Would be interested in seeing a deeper dive in the future. Maybe another async program or a code roast of one.

  • @baba5788
    @baba5788 2 года назад

    Phenomenal 🤝

  • @arturkabitcher
    @arturkabitcher 2 года назад

    thanks to this video, I finally got that concept of async/await. Thanks, Arjan! Please let's do a deep dive into async programming

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      Thanks so much Arthur, glad it was helpful!

  • @rollerskaterevival8484
    @rollerskaterevival8484 6 месяцев назад

    Thank you for this video! I had a suspicion that writing everything with "await" meany my code was essentially still synchronous. Now I understand what I need to do in order to make it actually async.

    • @ArjanCodes
      @ArjanCodes  6 месяцев назад

      Glad the video was helpful in your endeavors!

  • @ledempire9066
    @ledempire9066 Год назад

    Absolutely f'n wow! Your videos are so informative! Thank you for what you do, just found your channel, best one on python so far that i found in years ) And yes we would love to see more on async, if possible with databases. Precisely with python-oracledb that would be incredibly useful!

    • @ArjanCodes
      @ArjanCodes  Год назад

      Thanks so much- glad you like the content!

  • @HariTrigger
    @HariTrigger 4 месяца назад

    Definitely would like to see more of asyncio

  • @TechLord79
    @TechLord79 2 года назад

    I'm having some previous knowledge of async in another language, but alone those two wrappers are just mind-blowing in their elegance and simplicity and use of Python syntactic sugar :O I'm sure my hobbyist scraping projects will benefit from that!

  • @petrnovota8238
    @petrnovota8238 2 года назад

    Great video, again :) Gonna learn the asyncio basics now, i am doing some web scraping where this is gona be super helpful, and when i am done I hope there will be a folloup in depth asyncio tutorial from you :)

    • @ArjanCodes
      @ArjanCodes  2 года назад

      Glad it was helpful Petr! I did a follow-up recently you might like as well: ruclips.net/video/GpqAQxH1Afc/видео.html.

  • @harshjoshi5242
    @harshjoshi5242 2 года назад

    Awesome tutorial!!

    • @ArjanCodes
      @ArjanCodes  2 года назад

      Thank you, glad you liked it!

  • @Khushpich
    @Khushpich 2 года назад

    Great tutorial arjan thanks

  • @takudzwamakusha5941
    @takudzwamakusha5941 2 года назад +1

    Thanks a lot, would love that follow up video please

  • @walterppk1989
    @walterppk1989 2 года назад

    Hi Arjan, fantastic video, really useful for my team, we would love to see the follow up as well.

  • @adjbutler
    @adjbutler 2 года назад

    Yes please. More Asynchronous!

  • @EldorJ10
    @EldorJ10 2 года назад

    Great video, I suggest adding timer so that we actually see the speed improvement.

  • @kafeyin
    @kafeyin 2 года назад

    You are the man!

  • @aadithyavarma
    @aadithyavarma 2 года назад

    Aysnc in Python is much easier to understand now. Thanks!
    Would love to see the follow up video with more advanced stuff.

  • @TankaNafaka
    @TankaNafaka 2 года назад +1

    I really like the way how you structured simple program and while explaining problems and solutions, how and where to include async. @ 13:00 you nailing the hammer. Greetings from DK 😃

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      Thank you, glad to hear you liked it!

  • @vincentown
    @vincentown 2 года назад

    Brilliant!

  • @ravenecho2410
    @ravenecho2410 2 года назад

    very cool, happy holidays 😋

  • @izzikora6751
    @izzikora6751 Год назад

    Did you ever end up doing the follow-up video discussed here with the more in-depth features? This video (like all your videos) was great and I'd love to see more on this

  • @clonerrr
    @clonerrr 2 года назад

    Great explanation!

    • @ArjanCodes
      @ArjanCodes  2 года назад

      Thank you José, happy to hear you liked it!

  • @kris_maussen
    @kris_maussen 2 года назад

    Thanks for the great tutorials ... I'm just a beginner but yeps looking forward to more information of queues, locks, etc. with asyncio.

    • @ArjanCodes
      @ArjanCodes  2 года назад +1

      Thank you, glad to hear you like them!

  • @TK-zn5fb
    @TK-zn5fb 2 года назад

    Really great video. Thanks