当前位置: 首页 > wzjs >正文

同一个空间可以做两个网站么上海专业的网站建设公司排名

同一个空间可以做两个网站么,上海专业的网站建设公司排名,微网站 域名,建设河南分行网站协程(Coroutine)是Python中实现异步编程的重要方式,它比线程更轻量级,可以在单线程内实现并发操作。在 Python 中,协程(Coroutine)是一种特殊的函数,它允许在执行过程中暂停和恢复。协程是异步编程的重要组…

        协程(Coroutine)是Python中实现异步编程的重要方式,它比线程更轻量级,可以在单线程内实现并发操作。在 Python 中,协程(Coroutine)是一种特殊的函数,它允许在执行过程中暂停和恢复。协程是异步编程的重要组成部分,尤其是在处理 I/O 密集型任务时,能够显著提高程序的效率。Python 的 asyncio 模块为协程提供了强大的支持。下面我将通过详细案例讲解Python协程函数的使用。

一、协程基础概念

        协程是一种用户态的轻量级线程,由用户控制调度。与线程不同,协程的切换不需要操作系统介入,因此开销更小。

1. 协程与普通函数的区别

  • 普通函数:调用时进入,返回时退出,一次性执行完毕

  • 协程函数:可以暂停执行,保留状态,后续可以从暂停处恢复执行

二、协程的实现方式

Python中实现协程主要有三种方式:

  1. 生成器实现的协程(Python 2.5+)

  2. asyncio库实现的协程(Python 3.4+)

  3. async/await语法实现的协程(Python 3.5+)

我们主要讲解现代Python(3.5+)推荐的async/await方式。

三、async/await基础语法

协程的基本概念

  1. 定义协程函数:使用 async def 关键字定义协程函数。
    async def my_coroutine():print("Hello from coroutine")
  2. 调用协程函数:协程本身不会自动执行,需要显式调用(例如通过事件循环)或通过 await 来调度。直接调用协程函数不会执行它,而是返回一个协程对象:
    coro = my_coroutine()  # 此时不会执行
  3. 运行协程:要运行协程,需要事件循环,asyncio库的核心,负责调度和执行协程:
    import asyncioasync def my_coroutine():print("Hello from coroutine")# 获取事件循环
    loop = asyncio.get_event_loop()
    # 运行协程直到完成
    loop.run_until_complete(my_coroutine())
    loop.close()
    Python 3.7+可以简化为:
    asyncio.run(my_coroutine())
    输出:
    Hello from coroutine
    
  4. 暂停与恢复:协程可以在 await 表达式处暂停,等待某个异步操作完成,然后恢复执行。

四、协程案例讲解

示例1:简单的协程

以下是一个简单的协程示例,展示了如何定义、启动和使用协程:

import asyncio# 定义一个协程函数
async def say_hello(name, delay):print(f"Hello, {name}! Waiting for {delay} seconds...")await asyncio.sleep(delay)  # 模拟异步操作,协程在此处暂停print(f"Hello again, {name}!")# 主协程,用于调度其他协程
async def main():# 将协程包装为任务并调度执行task1 = asyncio.create_task(say_hello("Alice", 2))task2 = asyncio.create_task(say_hello("Bob", 1))# 等待所有任务完成await task1await task2# 启动事件循环并运行main协程
asyncio.run(main())
Hello, Alice! Waiting for 2 seconds...
Hello, Bob! Waiting for 1 seconds...
Hello again, Bob!
Hello again, Alice!

案例2:基本协程使用

import asyncioasync def my_coroutine(name, delay):await asyncio.sleep(delay)  # 模拟IO操作print(f"Hello, {name}!")async def main():print("Starting...")await my_coroutine("Alice", 1)  # 等待1秒await my_coroutine("Bob", 2)    # 再等待2秒print("Finished!")asyncio.run(main())

输出: 

Starting...
Hello, Alice!  # 1秒后
Hello, Bob!    # 再过2秒后(总共3秒)
Finished!

案例3:并发执行多个协程

使用asyncio.gather()可以并发运行多个协程,协程的执行顺序取决于它们的耗时:

import asyncioasync def fetch_data(name, delay):print(f"Fetching data {name} started")await asyncio.sleep(delay)  # 模拟网络请求print(f"Data {name} received!")return f"data-{name}"async def main():# 使用gather并发执行多个协程results = await asyncio.gather(fetch_data('A', 2),fetch_data('B', 1),fetch_data('C', 3))print(f"All done! Results: {results}")asyncio.run(main())

输出:

Fetching data A started
Fetching data B started
Fetching data C started
Data B received! # 1秒后
Data A received! # 2秒后
Data C received! # 3秒后
All done! Results: ['data-A', 'data-B', 'data-C']

(注意:总共耗时约3秒(最长的任务),而不是6秒(2+1+3)。)

案例4:协程与任务(Task) 

import asyncioasync def worker(name, queue):while True:delay = await queue.get()print(f"{name} starting task with delay {delay}")await asyncio.sleep(delay)print(f"{name} finished task with delay {delay}")queue.task_done()async def main():queue = asyncio.Queue()# 放入一些任务for delay in [1, 2, 3, 1, 2]:await queue.put(delay)# 创建3个worker任务tasks = []for i in range(3):task = asyncio.create_task(worker(f"Worker-{i}", queue))tasks.append(task)# 等待队列清空await queue.join()# 取消worker任务for task in tasks:task.cancel()# 等待所有worker任务被取消await asyncio.gather(*tasks, return_exceptions=True)asyncio.run(main())

输出:

Worker-0 starting task with delay 1
Worker-1 starting task with delay 2
Worker-2 starting task with delay 3
Worker-0 finished task with delay 1
Worker-0 starting task with delay 1
Worker-1 finished task with delay 2
Worker-1 starting task with delay 2
Worker-0 finished task with delay 1
Worker-1 finished task with delay 2
Worker-2 finished task with delay 3

 案例5:超时处理

import asyncioasync def slow_operation():print("Starting slow operation")await asyncio.sleep(5)  # 模拟耗时操作print("Slow operation completed")return "Result"async def main():try:# 设置3秒超时result = await asyncio.wait_for(slow_operation(), timeout=3)print(f"Got result: {result}")except asyncio.TimeoutError:print("Operation timed out!")asyncio.run(main())

输出:

Starting slow operation
Operation timed out!  # 3秒后
# 不会看到"Slow operation completed"

案例6:实际HTTP请求示例

import asyncio
import aiohttp  # 需要安装: pip install aiohttp
from aiohttp import TCPConnectorasync def fetch_url(session, url):print(f"Fetching {url}")async with session.get(url) as response:return await response.text()async def main():urls = ["https://www.baidu.com","https://www.python.org","https://cn.bing.com/"]#解决aiohttp证书出错的问题:证书设置为False即可解决aiohttp.ClientSession(connector=TCPConnector(ssl=False))async with aiohttp.ClientSession(connector=TCPConnector(ssl=False)) as session:tasks = [fetch_url(session, url) for url in urls]results = await asyncio.gather(*tasks)for url, content in zip(urls, results):print(f"{url} returned {len(content)} bytes")asyncio.run(main())

输出:

Fetching https://www.baidu.com
Fetching https://www.python.org
Fetching https://cn.bing.com/
https://www.baidu.com returned 28918 bytes
https://www.python.org returned 50832 bytes
https://cn.bing.com/ returned 180243 bytes

五、协程原理与注意事项

1. 协程工作原理

  • 协程通过事件循环(Event Loop)实现并发

  • 遇到await表达式时,协程暂停并将控制权交还给事件循环

  • 事件循环调度其他就绪的协程运行

  • await的操作完成时,协程从暂停处恢复执行

2. 注意事项

  1. 不要在协程中使用阻塞IO:如time.sleep()会阻塞整个线程

  2. 协程需要被await:忘记await会导致协程不执行

  3. 合理控制并发量:过多并发可能导致资源耗尽

  4. 错误处理:协程中的异常需要通过try/except捕获

3. 协程适用场景

  • 高并发的网络IO操作

  • 需要处理大量连接的服务器

  • 需要并发执行但线程开销太大的场景

  • 需要精细控制执行流程的异步任务

六、总结

Python的协程通过async/await语法提供了清晰的异步编程模型。关键点:

  1. 使用async def定义协程函数

  2. 使用await暂停协程执行,等待异步操作完成

  3. 使用asyncio.run()运行顶层协程

  4. 使用asyncio.gather()并发运行多个协程

  5. 使用asyncio.create_task()创建后台任务

协程是Python异步编程的核心,掌握它可以显著提高IO密集型应用的性能。


文章转载自:

http://MXBbultW.dmzfz.cn
http://NAVvo8lh.dmzfz.cn
http://AV4xtlXw.dmzfz.cn
http://5DJSoHNO.dmzfz.cn
http://FnEwP9sm.dmzfz.cn
http://uNqTYVo2.dmzfz.cn
http://frZjklS6.dmzfz.cn
http://IY1nbrGt.dmzfz.cn
http://mtnErvGI.dmzfz.cn
http://NWHH3TBy.dmzfz.cn
http://ZvdMbX6X.dmzfz.cn
http://OnVlVA8S.dmzfz.cn
http://vGc5Euk0.dmzfz.cn
http://mJKTYWgY.dmzfz.cn
http://fi5lwHVd.dmzfz.cn
http://tJZBh3vZ.dmzfz.cn
http://iPpBYdif.dmzfz.cn
http://cF2seKCl.dmzfz.cn
http://gqB4Hr9Q.dmzfz.cn
http://zIbLGPAY.dmzfz.cn
http://dNYe4T2v.dmzfz.cn
http://SX20AC7Q.dmzfz.cn
http://X0XZduug.dmzfz.cn
http://FRjE7pVb.dmzfz.cn
http://xXNFwjdh.dmzfz.cn
http://Ln8Ljuwr.dmzfz.cn
http://YHqtLVQf.dmzfz.cn
http://7hF80FYC.dmzfz.cn
http://cI6ywZEz.dmzfz.cn
http://cYYXY5kS.dmzfz.cn
http://www.dtcms.com/wzjs/779569.html

相关文章:

  • 响应式 企业网站商城网页
  • 做网站网页的人是不是思维页面设计
  • 更改了网站关键词后要怎么做小程序制作公司排行
  • 网站介绍怎么写大连做网站好的公司
  • 我的网站怎么不能搜索怎么制作游戏需要什么软件
  • 企业做网站便宜网站建设如果没有源代码
  • 深圳外贸网站制作公司主页模板
  • 做国外服务器网站吗微信推广方式都有哪些
  • 做电商讲师课程的网站建筑工程网络教育自我鉴定
  • 长沙网站建设及推广公司建模培训
  • 漳州模板网站建设网站怎么做微信扫描登录网站
  • 怎么编写网站外贸网站免费建站
  • 旭泽建站国内外网站建设
  • 网站广告的图片怎么做软件开发成本估算
  • 网站建设的500字小结源码交易网站
  • 怎么弄 一个空间放两个网站 用不同的域名呼市网站设计
  • 湘西泸溪网站建设手机网站 兼容
  • 广州做网站公司排名微信做网站的公司
  • 网站开发学什么比较有优势wordpress 菜单 移动端
  • 沙漠风网站建设公司网站营销怎么做
  • 网站建设推广平台查询网站内页关键词排名
  • 唐山网站提升排名做网站实例
  • 新城免费做网站成都网站建设索q479185700
  • 建手机网站的软件有哪些购物网站大全棉鞋
  • 车公庙网站建设西安网站建设缑阳建
  • 创业开网站建设公司华为网站建设方案模板
  • 文化传媒网站封面网站别人做的上面有方正字体
  • 网上做论文的网站有哪些内容免费在线观看高清影片
  • 重庆建站公司哪个好二级域名注册免费
  • 做淘宝有没有店小秘类型的网站dede网站模板怎么改