python3协程

    python线程多并发,是指在一个进程中开启n个线程,以此来达到并发执行任务。但是python中的线程有GIL解释锁,只能在同一时间运行一个线程。多线程的并发是多个线程来回切换去执行任务。线程少的话没什么影响,如果开的线程特别多,就会导致线程切换太耗费资源,达不到想要的多线程并发的效果。个人观点(python中的线程有点鸡肋)。

    python协程,最近一段时间接触协程,发现协程完全可以替代线程来去进行高并发的任务

    先说一下协程的运行原理,就像一个生成器,有存取自己上下文的栈。每当遇到IO操作时就会挂起,就相当于暂停,等待数据的返回,在等待的时间再去执行别的任务,以此来达到任务的切换。并且协程是运行在单线程内,所以任务的切换并不耗费资源,效率相对于多线程来说,要高很多。

    从接触协程一直是在研究基于 python 3.6的协程,3.6中的协程已不同于以前,自定义了语法。

        async def function():

    .......

    这样就是定义了一个协程的函数,但里面必须要有await的关键字才能达到切换的目的。
例如:
async def test():

await asyncio.sleep(2)

    这就是一个完整的协程函数。原理就是当运行这个函数的时候,当遇见await这个关键字,这个函数就会挂起,然后去执行别的任务

    协程的运行比较麻烦,需要先获得一个循环事件,里面相当于一个无限的循环,协程只能在这个循环事件中运行
import asyncio
new_loop = asyncio.new_event_loop() # 获取一个循环事件

new_loop.run_until_complete(function()) #将运行的函数放入里面

    这样协程就可以运行测试了

    简单说这些吧,放一个我写的demo.爬虫用的

      import asyncio
	import aiohttp
	import time

	HEADERS = {
	    'User-Agent': "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
	    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
	    'Accept-Language': 'en-US,en;q=0.5',
	    'Accept-Encoding': 'gzip, deflate',
	}

	urls = 'https://sh.lianjia.com/ershoufang/pg{}/'
	num = 100


	async def get(url):
	    async with aiohttp.ClientSession() as session:
	        async with session.get(url, headers=HEADERS) as response:
	            bytes = await response.read()
	            bytes = bytes.decode('utf-8')  # 不能这么写  await response.read().bytes.decode('utf-8') 会报错 必须重新赋值 因为默认是协程的对象
	            print(bytes)
	            return


	async def main():
	    url_list = [urls.format(i) for i in range(num)]
	    task = []
	    for url in url_list:
	        task.append(get(url))
	    await asyncio.gather(*task)


	a = time.time()
	new_loop = asyncio.new_event_loop()
	new_loop.run_until_complete(main())
	print(time.time() - a)


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值