python简单线程和协程学习心得(分享)


Posted in Python onJune 14, 2017

python中对线程的支持的确不够,不过据说python有足够完备的异步网络框架模块,希望日后能学习到,这里就简单的对python中的线程做个总结

threading库可用来在单独的线程中执行任意的python可调用对象。尽管此模块对线程相关操作的支持不够,但是我们还是能够用简单的线程来处理I/O操作,以减低程序响应时间。

from threading import Thread
import time
 
 
def countdown(n):
  while n > 0:
    print('T-minus:', n)
    n -= 1
 
 
t = Thread(target=countdown, args=(10,))
t.start() # 开启线程
 
time.sleep(2)
 
if t.is_alive() is True:
  print("停止线程...")
  t._stop() # 停止线程

start函数是用来开启线程的,_stop函数是用来停止线程的。为了防止在线程中进行I/O操作时出现阻塞等问题,运行一段时间之后,可以判断线程是否还存活,如果线程还存在就调用_stop()停止,防止阻塞(你可以将_stop函数封装到类中,我这里并没有这么做)。

当然,你可以调用ThreadPool线程池来处理,而不是手动创建线程。如果线程间不需要共享变量的话,使用线程还是很方便的,可以减少很多的麻烦操作以及省时。如果需要在线程间进行通信,我们可以使用队列来实现:

from queue import Queue
from threading import Thread
 
 
class kill:
  def terminate(self, t):
    if t.isAlive is True:
      t._stop()
 
 
def product(out_q):
  for i in range(5):
      out_q.put(i)
 
 
def consumer(in_q):
  for i in range(5):
    print(in_q.get())
 
 
q = Queue()
t1 = Thread(target=consumer, args=(q,))
t2 = Thread(target=product, args=(q,))
t1.start()
t2.start()
 
 
k = kill() # 查询线程是否终止,防止阻塞...
k.terminate(t1)
k.terminate(t2)

Queue实例会被所有的线程共享,同时它又拥有了所有所需要的锁,因此它们可以安全的在任意多的线程中共享。在这里要注意,不要再多线程中使用除了put(),get()方法之外的queue类的方法,因为在多线程环境中这是不可靠的!对于简单的小型的线程中数据的通信,可以使用队列来处理。如果是大型的数据需要交互通信,python提供了相关的模块你可以使用,具体的u need baidu.

所谓协程,其实就是在单线程的环境下的yield程序。

from collections import deque
 
 
def countdown(n):
  while n > 0:
    print("T-minus", n)
    yield # 返回之后下次直接从这里执行...相当于C#里面得yield return .
    n -= 1
  print("this is countdown!!!")
 
 
def countup(n):
  x = 0
  while x < n:
    print("Counting up", x)
    yield
    x += 1
 
 
class TaskScheduler:
  def __init__(self):
    self._task_queue = deque()
 
  def new_task(self, task):
    self._task_queue.append(task)
 
  def run(self):
    while self._task_queue:
      task = self._task_queue.popleft()
      try:
        next(task)
        self._task_queue.append(task)
      except StopIteration:
        pass
 
 
sche = TaskScheduler()
sche.new_task(countdown(10))
sche.new_task(countdown(5))
sche.new_task(countup(15))
sche.run()

在这里说下自己这段时间使用python的心得,python的确不错,但性能也是为人诟病,一开始学习python,我也是去做一些比较炫的程序,最起码听起来逼格高,比如使用python的自然语言处理来做情感分析以及最热的爬虫程序,还有做炫的数据分析图表。渐渐地,我就放下了那些,因为程序的重点不在那些,只要你会点基本的语法,看得懂官方文档就能够做出来,而程序代码的重点在性能,优化。最大程度的写出功能最完善,性能最优,结构最优美的程序,其实这就有点像是政治老师常说的"文化软实力",程序中的"软实力"应该是在程序中嵌入最适合的设计模式,做最完备的程序优化,采用最省性能的数据结构等。

以上这篇python简单线程和协程学习心得(分享)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python自定义解析简单xml格式文件的方法
May 11 Python
python多进程共享变量
Apr 06 Python
Python算法应用实战之栈详解
Feb 04 Python
tornado 多进程模式解析
Jan 15 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 Python
django2笔记之路由path语法的实现
Jul 17 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
Jul 21 Python
pycharm 实现调试窗口恢复
Feb 05 Python
pandas 操作 Excel操作总结
Mar 31 Python
Python字符串处理实现单词反转
Jun 14 #Python
python3实现UDP协议的服务器和客户端
Jun 14 #Python
老生常谈Python基础之字符编码
Jun 14 #Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 #Python
Python之re操作方法(详解)
Jun 14 #Python
Python之py2exe打包工具详解
Jun 14 #Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 #Python
You might like
PHP遍历二维数组的代码
2011/04/22 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
XML的代替者----JSON
2007/07/21 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
JS hashMap实例详解
2016/05/26 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
Node 使用express-http-proxy 做api网关的实现
2020/10/15 Javascript
python实现在字符串中查找子字符串的方法
2015/07/11 Python
python搭建微信公众平台
2016/02/09 Python
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
python pandas修改列属性的方法详解
2018/06/09 Python
Python自动抢红包教程详解
2019/06/11 Python
python pandas时序处理相关功能详解
2019/07/03 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
科室工作个人总结的自我评价
2013/10/29 职场文书
访谈节目策划方案
2014/05/15 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
故宫导游词
2015/01/31 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书