Re: async learning

Mats Wichmann <[email protected]>
Newsgroups gmane.comp.python.tutor
Message-ID <[email protected]>
On 7/4/23 16:02, Alan Gauld via Tutor wrote:
> On 02/07/2023 13:21, Leam Hall wrote:
>> Until recently, I haven't had a lot of reason to do async stuff. ...> but it runs slower than the non-async version. Thoughts?
> 
> I'm no expert but trivial tasks often run slower on async
> architecture than when in a single process, even a single
> thread.
> 
> I don;t know how you measured things or what kind of tasks
> you were doing, but if a single task takes less than a few
> milliseconds to execute it's likely that the overheads in
> async are higher than the benefits of concurrency.
> 
> Try creating a task that takes some time such as opening a
> file and processing its contents in some
> way(search/sort/convert/calculate something per line, say). Then create
> many such
> files and have your code process them all. That should show
> a gain of some sort.

This one does (fetches from a url, the classic example of a "slow" 
operation in computer terms), but... it's not happening in an async 
function.  As a first step, "add_stuff" needs to be an "async def".
> 
> Concurrency is hard! And the right kind of concurrency
> depends greatly on the problem. async is best suited to
> server type scenarios.
> 
> 
>>
>> The parameters are:
>> 	Python 3.9 or 3.10
>> 	Import from Standard Library only
>> 	Later, add_stuff() will include running python processes to gather data
>>
>> Code so far:
>>
>> import asyncio
>> import urllib.request
>>
>> site = "https://en.wikipedia.org/wiki/"
>>
>> def add_stuff(name, site):
>>       url = site + name
>>       result = dict()
>>       result['name'] = name.replace('_', ' ')
>>       result['details'] = urllib.request.urlopen(url).read()
>>       return result
>>
>> def show_stuff(thing):
>>       info = thing[1]
>>       name = info['name']
>>       details = info['details']
>>       result = "Let's look at {}, with {} bits and bytes of detail.".format(name, len(details))
>>       return result
>>
>> #async def main(names):
>> #    team = { name: add_stuff(name, site) for name in names}
>> #    return team
>>
>> if __name__ == "__main__":
>>       names = ["Frodo_Baggins", "Samwise_Gamgee", "Merry_Brandybuck", "Pippin_Took"]
>>
>>       #team = asyncio.run(main(names))
>>       team = { name: add_stuff(name, site) for name in names}
>>
>>       for t in sorted(team.items()):
>>           print(show_stuff(t))
> 
> 

_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.