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检查URL是否正常访问的小技巧
Feb 25 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
python启动应用程序和终止应用程序的方法
Jun 28 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
Python bytes string相互转换过程解析
Mar 05 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 Python
python中绕过反爬虫的方法总结
Nov 25 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 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比较两个绝对时间的大小
2014/01/31 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Jquery Autocomplete 结合asp.net使用要点
2010/10/29 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
根据Bootstrap Paginator改写的js分页插件
2016/12/25 Javascript
Angular.js跨controller实现参数传递的两种方法
2017/02/20 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
Python中实现的RC4算法
2015/02/14 Python
Django框架下在视图中使用模版的方法
2015/07/16 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
最新结婚典礼主持词
2014/03/14 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
撤诉书怎么写
2015/05/19 职场文书
详解Laravel服务容器的优势
2021/05/29 PHP
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android