多城市分站站群cms那个装修公司的网站做的好
2026/2/5 19:32:20 网站建设 项目流程
多城市分站站群cms,那个装修公司的网站做的好,wordpress标签显示图片,企业网站带后台模板运行协程#xff0c;asyncio 提供了三种主要机制 asyncio.run最高层级的入口点 对协程执行 await 使用asyncio.create_task()函数用来并发运行作为 asyncio 任务 的多个协程 多个顺序执行 import asyncio import time asyncio.run async def say_after(delay, what):awai…运行协程asyncio 提供了三种主要机制asyncio.run最高层级的入口点对协程执行 await使用asyncio.create_task()函数用来并发运行作为 asyncio任务的多个协程多个顺序执行importasyncioimporttime asyncio.runasyncdefsay_after(delay,what):awaitasyncio.sleep(delay)print(what)asyncdefmain():print(fstarted at{time.strftime(%X)})awaitsay_after(1,hello)awaitsay_after(2,world)print(ffinished at{time.strftime(%X)})asyncio.run(main())started at 20:15:44helloworldfinished at 20:15:47多个异步执行importasyncioimporttimeasyncdefsay_after(delay,what):awaitasyncio.sleep(delay)print(what)asyncdefmain():task1asyncio.create_task(say_after(1,hello))task2asyncio.create_task(say_after(2,world))print(fstarted at{time.strftime(%X)})# Wait until both tasks are completed (should take# around 2 seconds.)awaittask1awaittask2print(ffinished at{time.strftime(%X)})asyncio.run(main())started at 20:17:33helloworldfinished at 20:17:35通过上面的对比可以看到第二个输出比第一个快了一秒协程高级接口api关于协程asyncio.gather(*aws,return_exceptionsFalse)并发运行aws序列中的可等待对象这个也是并行上面的create_task可也并行。其实gather里面调用了create_task。这个loop是更低级的接口如果return_exceptions为False(默认)所引发的首个异常会立即传播给等待gather()的任务。aws序列中的其他可等待对象不会被取消并将继续运行。如果return_exceptions为True异常会和成功的结果一样处理并聚合至结果列表。这个方法会返回一个列表用于存储可等待对象也就是协程的返回结果。而且这个结果是跟任务的执行顺序一样asyncdefrequest_get(session,url):asyncwithsession.get(url)asresponse:returnf{url}内容:{awaitresponse.text()}asyncdefmain():asyncwithaiohttp.ClientSession()assession:urls[https://example.com/a,https://example.com/b,https://example.com/c]tasks[asyncio.wait_for(request_get(session,url),timeout1)forurlinurls]resultsawaitasyncio.gather(*tasks,return_exceptionsTrue)print(results)asyncio.run(main())输出结果[ ‘https://example.com/a 内容: …’,‘https://example.com/b 内容: …’, ‘https://example.com/c 内容:…’]当为return_exceptions为False会直接报错导致程序失败所以需要增加异常处理。当为return_exceptions为true如果有异常会存进返回的列表中。asyncdefrequest_get(session,url):ifurlhttps://example.com/a:awaitasyncio.sleep(3)asyncwithsession.get(url)asresponse:returnf{url}内容:{awaitresponse.text()}asyncdefmain():asyncwithaiohttp.ClientSession()assession:urls[https://example.com/a,https://example.com/b,https://example.com/c]tasks[asyncio.wait_for(request_get(session,url),timeout1)forurlinurls]resultsawaitasyncio.gather(*tasks,return_exceptionsTrue)print(results)foriinresults:print(i)asyncio.run(main())输出结果[TimeoutError(),‘https://example.com/b 内容: …’, ‘https://example.com/c 内容:…’]https://example.com/b 内容: …https://example.com/c 内容: …由上面的输出可以看到TimeoutError()这个异常存进了结果列表。虽然通过for循环遍历了但是程序并没有报错而且没有输出所以这就需要自己处理错误。for循环可以更改为一下所示foriinresults:ifisinstance(i,Exception):print(type(i))print(f任务失败{type(i).__name__})else:print(i)输出如下任务失败TimeoutErrorhttps://example.com/b 内容: …https://example.com/c 内容: …单个任务设置超时时间 asyncio.wait_for(aw,timeout)aw是一个可等待对象也就是协程timeout是超时时间可以为None也可以为 float 或 int 型数值表示的等待秒数如果发生超时任务将取消并引发asyncio.TimeoutError返回值是执行协程的返回值多个任务设置超时时间 asyncio.wait(*aws,timeoutreturn_whenALL_COMPLETED)并发地运行aws是一个可等待对象的可迭代对象。这跟上面的wait_for中的aw是不一样的。timeout是超时时间可以为None也可以为 float 或 int 型数值表示的等待秒数如果发生超时任务将取消并引发asyncio.TimeoutError返回两个 Task/Future 集合:(done, pending)这个其实跟python的线程或者进程是类似的可查看python 线程与多线程简单使用他也有wait、as_completed方法。return_when的可选项如下常量描述FIRST_COMPLETED函数将在任意可等待对象结束或取消时返回。FIRST_EXCEPTION函数将在任意可等待对象因引发异常而结束时返回。当没有引发任何异常时它就相当于ALL_COMPLETED。ALL_COMPLETED函数将在所有可等待对象结束或取消时返回。注意1、这个wait与wait_for不一样wait_for在超时后会抛错TimeoutError但是wait方法不会。如下所示importaiohttpimportasyncioimporttimeasyncdefrequest_get(session,url):ifurlhttps://example.com/a:awaitasyncio.sleep(3)asyncwithsession.get(url)asresponse:returnf{url}内容:{awaitresponse.text()}asyncdefmain():asyncwithaiohttp.ClientSession()assession:urls[https://example.com/a,https://example.com/b,https://example.com/c]tasks[request_get(session,url)forurlinurls]done,pendingawaitasyncio.wait(tasks,timeout1)print(....................................)print(done)print(....................................)print(pending)输出1766493515.1018946…{Task finished name‘Task-3’ cororequest_get() done, defined at e:\code… result‘…’,Task finished name‘Task-4’ cororequest_get() done, defined at e:\code…6 result‘…’}…{Task pending name‘Task-2’ cororequest_get() running at e:\code\pycharmcode\test\asyhttp_test\01.py:8 wait_for}1766493516.1151073可以看出时间从1766493515.1018946到1766493516.1151073任务3、4都执行完成了但是任务2没有完成。所有的输出没有任务error都是task对象。这就引申出第二个注意事项2、对未完成的任务做处理上面的例子中pending集合里还有任务且它正在执行如果我们不管可能会造成资源消耗内存泄漏等。上面的例子简单如果说有复杂的任务在规定时间内没有完成然后不做处理就可能会一直运行我们也不知道。我们可以运行task.cancel()方法来取消task对象Task.cancel()不保证 Task 会被取消。示例如下fortaskinpending:task.cancel()try:awaittaskexceptasyncio.CancelledError:print(main(): cancel_me is cancelled now)多个任务设置超时时间asyncio.as_completed(aws, ***,timeoutNone)并发地运行aws可迭代对象中的 可等待对象。返回一个协程的迭代器。 所返回的每个协程可被等待以从剩余的可等待对象的可迭代对象中获得最早的下一个结果。如果在所有 Future 对象完成前发生超时则将引发asyncio.TimeoutError最早的下一个结果指的是结果与任务顺序不对照。例如三个任务1、2、3执行后返回自己的数字as_completed返回的可能是[1,3,2]或者[3,1,2]谁先执行完先返回谁。wait方法返回的结果只能是[1,2,3]一点解惑刚开始看协程对于什么时间使用await不太理解。写出过下面的代码asyncdefrequest_get(session,url):asyncwithsession.get(url)asresponse:returnf{url}内容:{awaitresponse.text()}asyncdefmain():asyncwithaiohttp.ClientSession()assession:urls[https://example.com/a,https://example.com/b,https://example.com/c]tasks[awaitrequest_get(session,url)forurlinurls]done,pendingawaitasyncio.wait(tasks,timeout1)tasks [await request_get(session, url) for url in urls]我在request_get前面使用了await其实它的使用方法我在文章开头就写了asyncio提供了三种主要机制来运行协程其中就有await所以按照上面我的错误写法更改成下面的代码执行你就会发现没有执行waitrequest_get也会执行。asyncdefrequest_get(session,url):asyncwithsession.get(url)asresponse:returnf{url}内容:{awaitresponse.text()}asyncdefmain():asyncwithaiohttp.ClientSession()assession:urls[https://example.com/a,https://example.com/b,https://example.com/c]tasks[awaitrequest_get(session,url)forurlinurls]# done, pending await asyncio.wait(tasks, timeout1) 将这一行删掉

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询