Python 学习笔记 - 协程

简介:

Python里面控制并发,除了多线程和多进程,还可以使用协程(CoRoutine)。他是在一个线程内通过程序员人为的指定来进行切换


例1:通过switch()可以人为来回切换到另外一个函数;当所有函数执行完毕,最后输出print(10)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Alex Li
from  greenlet  import  greenlet
def  test1():
     print ( 12 )
     gr2.switch()
     print ( 34 )
     gr2.switch()
     print ( '9' )
def  test2():
     print ( 56 )
     gr1.switch()
     print ( 78 )
     gr1.switch()
gr1  =  greenlet(test1)
gr2  =  greenlet(test2)
gr1.switch()
print ( 10 )
- - - - - - - -
12
56
34
78
9
10


例2,除了greenlet模块 我们还可以使用gevent模块

gevent是第三方库,通过greenlet实现协程,其基本思想是:

当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。

由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,这一过程在启动时通过monkey patch完成:


例如:首先导入Gevent和猴子补丁,然后定义一个函数f,gevent.spawn的主要功能是生产greenlet的对象,然后他会内部自动切换,当执行了第一个打印命令之后,因为会阻塞,所以会自动切换到其他的greenlet对象执行操作,之后再切换回来获取数据结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
from  gevent  import  monkey; monkey.patch_all()
import  gevent
import  requests
def  f(url):
     print ( 'GET: %s'  %  url)
     resp  =  requests.get(url)
     data  =  resp.text
     print ( '%d bytes received from %s.'  %  ( len (data), url))
gevent.joinall([
         gevent.spawn(f,  'https://www.python.org/' ),
         gevent.spawn(f,  'https://www.yahoo.com/' ),
         gevent.spawn(f,  'https://github.com/' ),
])
- - - - - - - - - -
"C:\Program Files\Python3\python.exe"  C: / temp / s13day11 / day11 / s18.py
GET: https: / / www.python.org /
GET: https: / / www.yahoo.com /
GET: https: / / github.com /
47413  bytes received  from  https: / / www.python.org / .
24810  bytes received  from  https: / / github.com / .
450576  bytes received  from  https: / / www.yahoo.com / .





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1869198,如需转载请自行联系原作者

目录
相关文章
|
27天前
|
存储 C语言 Python
【Python】学习笔记day3
【Python】学习笔记day3
27 1
|
1月前
|
并行计算 调度 开发者
深入浅出Python协程:提升你的异步编程效率
在当今快速发展的软件开发领域,异步编程已成为提高程序性能和用户体验的关键技术。Python,作为一门广泛使用的高级编程语言,其协程(Coroutine)功能为开发者提供了强大的异步编程工具。本文将从协程的基本概念入手,通过实例深入浅出地讲解如何在Python中有效利用协程来提升异步编程的效率和可读性。我们将探讨协程的工作原理、与传统多线程/多进程相比的优势,以及如何在实际项目中应用协程来解决复杂的并发问题。通过本文的学习,读者将能够掌握Python协程的核心知识,为构建高效、可维护的异步应用奠定坚实基础。
|
9天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
28 0
|
9天前
|
Python
基于Django的Python应用—学习笔记—功能完善
基于Django的Python应用—学习笔记—功能完善
|
27天前
|
存储 C语言 芯片
【Python】学习笔记day1
【Python】学习笔记day1
33 1
|
30天前
|
API 数据处理 调度
Python中的异步编程与协程应用
传统的Python编程在处理IO密集型任务时常常面临效率低下的问题,而异步编程和协程技术的引入为解决这一问题提供了有效的途径。本文将介绍Python中异步编程的基本概念,深入探讨asyncio库的使用以及协程在实际项目中的应用,旨在帮助开发者更好地理解和运用异步编程技术。
|
1月前
|
算法 搜索推荐 测试技术
python排序算法及优化学习笔记1
python实现的简单的排序算法,以及算法优化,学习笔记1
33 1
|
1月前
|
调度 Python
python协程—asyncio模块
python协程—asyncio模块
24 0
|
1月前
|
API 开发者 Python
深入浅出Python协程:提升并发编程效率
在当今高速发展的互联网时代,高并发成为了软件开发中的一个重要需求。本文将引领读者深入理解Python中的协程(Coroutine)概念,探讨其在并发编程中的应用及优势。我们将从协程的基础概念出发,通过实例讲解如何使用asyncio库来编写高效的异步代码。文章旨在帮助读者掌握协程的工作原理和使用方法,从而在实际开发中能够更好地利用Python进行高效的并发编程。
|
1月前
|
数据采集 调度 开发者
深入浅出Python协程:提升并发编程效率
本文旨在为读者揭开Python协程的神秘面纱,通过深入浅出的方式阐述其工作原理及应用场景。不同于传统的技术文章摘要,我们将以一种独特的视角,将协程比作一场精心编排的交响乐,其中每一个乐章都是一个独立的任务,共同演绎出并发编程的华丽篇章。文章将从协程的基本概念切入,通过对比线程和进程,逐步深入到事件循环、异步IO等核心机制,最后通过案例分析,让读者能够掌握使用Python协程处理高并发任务的技巧,从而提升编程效率。