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数据结构之二叉树的建立实例
Apr 29 Python
深入解析Python中的WSGI接口
May 11 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
python 排序算法总结及实例详解
Sep 28 Python
老生常谈Python之装饰器、迭代器和生成器
Jul 26 Python
PyCharm设置护眼背景色的方法
Oct 29 Python
python实现超市商品销售管理系统
Nov 22 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
Jun 08 Python
golang/python实现归并排序实例代码
Aug 30 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
PHP4实际应用经验篇(4)
2006/10/09 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
基于JQuery的6个Tab选项卡插件
2010/09/03 Javascript
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
JS中使用DOM来控制HTML元素
2016/07/31 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
python获取糗百图片代码实例
2013/12/18 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
建筑学推荐信
2013/11/03 职场文书
施工协议书范本
2014/04/22 职场文书
校园文明标语
2014/06/13 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
学雷锋日活动总结
2015/02/06 职场文书
医生辞职信范文
2015/03/02 职场文书
2016公司年会通知范文
2015/04/25 职场文书
单位计划生育责任书
2015/05/09 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
分享mysql的current_timestamp小坑及解决
2021/11/27 MySQL
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技