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学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
关于Python中浮点数精度处理的技巧总结
Aug 10 Python
Python使用matplotlib填充图形指定区域代码示例
Jan 16 Python
将python文件打包成EXE应用程序的方法
May 22 Python
python分割一个文本为多个文本的方法
Jul 22 Python
pytorch索引查找 index_select的例子
Aug 18 Python
如何基于Python获取图片的物理尺寸
Nov 25 Python
基于pandas中expand的作用详解
Dec 17 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
简单了解python列表和元组的区别
May 14 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 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
我的论坛源代码(五)
2006/10/09 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
js数组操作常用方法
2014/05/08 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
js 获取元素在页面上的偏移量的方法汇总
2015/04/13 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
Ionic快速安装教程
2016/06/03 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
AngularJS的ng Http Request与response格式转换方法
2016/11/07 Javascript
JS实现鼠标移上去显示图片或微信二维码
2016/12/14 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
Python简易版停车管理系统
2019/08/12 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
中学生学雷锋演讲稿
2014/04/26 职场文书
团支部建设方案
2014/05/02 职场文书
电子商务专业自荐信
2014/06/02 职场文书
倡议书的格式写法
2015/04/28 职场文书
2015教师节通讯稿
2015/07/20 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL