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使用socket进行简单网络连接的方法
Apr 29 Python
Python 绘图库 Matplotlib 入门教程
Apr 19 Python
python获取时间及时间格式转换问题实例代码详解
Dec 06 Python
Python数据可视化之画图
Jan 15 Python
python 求1-100之间的奇数或者偶数之和的实例
Jun 11 Python
TensorFlow实现从txt文件读取数据
Feb 05 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
ipython jupyter notebook中显示图像和数学公式实例
Apr 15 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
python基础学习之递归函数知识总结
May 26 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
2020最新CPU的性能排名
2020/04/02 数码科技
杏林同学录(九)
2006/10/09 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
javascript得到XML某节点的子节点个数的脚本
2008/10/11 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
Python不规范的日期字符串处理类
2014/06/10 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
Python调用C++程序的方法详解
2017/01/24 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
python同步windows和linux文件
2019/08/29 Python
详解Flask前后端分离项目案例
2020/07/24 Python
html5理解head_动力节点Java学院整理
2017/07/13 HTML / CSS
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
华为慧通笔试题
2016/04/22 面试题
创业计划书——互联网商机
2014/01/12 职场文书
公司股东合作协议书
2014/09/14 职场文书
2014年领班工作总结
2014/11/25 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers