zoukankan      html  css  js  c++  java
  • python--协程知识初识


    线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。

    协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。

    协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;

    event loop是协程执行的控制点, 如果你希望执行协程, 就需要用到它们。

    event loop提供了如下的特性:

      1、注册、执行、取消延时调用(异步函数)
      2、创建用于通信的client和server协议(工具)
      3、创建和别的程序通信的子进程和协议(工具)
      4、把函数调用送入线程池中

    协程示例一:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 """
     4 协程示例
     5 """
     6 import asyncio
     7 
     8 async def test1():
     9     print("test1, starting")
    10     await test2()
    11     print("test1, ending")
    12 
    13 async def test2():
    14     print("test2 start")
    15 
    16 loop = asyncio.get_event_loop()  #asyncio.get_event_loop()  : asyncio启动默认的event loop
    17 loop.run_until_complete(test1())  #run_until_complete()  :  这个函数是阻塞执行的,知道所有的异步函数执行完成,
    18 loop.close()  #close()  :  关闭event loop。

    greenlet协程示例:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 """
     4 协程示例
     5 """
     6 import greenlet
     7 
     8 def fun1():
     9     print("12")
    10     f2.switch()
    11     print("56")
    12     f2.switch()
    13 
    14 def fun2():
    15     print("34")
    16     f1.switch()
    17     print("78")
    18 
    19 
    20 f1 = greenlet.greenlet(fun1)
    21 f2 = greenlet.greenlet(fun2)
    22 
    23 f1.switch()

    gevent协程示例:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 """
     4 gevent协程示例
     5 """
     6 import gevent
     7 
     8 def fun1():
     9     print("www.baidu.com")  #第一步
    10     gevent.sleep(0)
    11     print("end the baidu.com")  #第三步
    12 
    13 def fun2():
    14     print("www.yusheng.com")  #第二步
    15     gevent.sleep(0)
    16     print("end the yusheng.com")  #第四步
    17 
    18 gevent.joinall([
    19     gevent.spawn(fun1),
    20     gevent.spawn(fun2),
    21 ])

    示例三:遇到IO操作自动切换:

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 """
     4 遇到IO操作自动切换:
     5 """
     6 import gevent
     7 import requests
     8 
     9 def fun(url):
    10     print("get: %s" % url)
    11     gevent.sleep(0)
    12     data = requests.get(url)
    13     ret = data.text
    14     print(url, len(ret))
    15 
    16 gevent.joinall([
    17     gevent.spawn(fun, 'https://www.python.org/'),
    18     gevent.spawn(fun, 'https://www.yahoo.com/'),
    19     gevent.spawn(fun, 'https://github.com/'),
    20 ])
  • 相关阅读:
    idea 提示不能打开cmd.exe,idea 编译项目 CreateProcess error=740, 请求的操作需要提升 --->如何设置cmd以管理员身份运行
    Maven之--安装nexus 私服
    如何生成effective-pom
    maven之---资源过滤 在java/main/resourse/*.xml ,*.properties引用maven属性${db.username}
    使用JavaMailSender 发送邮件
    spring 读取account-service中的值
    spring web.xml 标签<param-name>contextConfigLocation</param-name>
    application.properties案例
    解决mybatis-plus的updateById报错的问题
    postman百度云下载
  • 原文地址:https://www.cnblogs.com/june-L/p/11826215.html
Copyright © 2011-2022 走看看