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 相关文章推荐
Python3实现连接SQLite数据库的方法
Aug 23 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
学习python类方法与对象方法
Mar 15 Python
分享6个隐藏的python功能
Dec 07 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
使用pycharm生成代码模板的实例
May 23 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
Jun 27 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
Python 2种方法求某个范围内的所有素数(质数)
Jan 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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
Python中的lstrip()方法使用简介
2015/05/19 Python
小小聊天室Python代码实现
2016/08/17 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
详解python中@的用法
2019/03/27 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
安全大检查反思材料
2014/01/31 职场文书
学生自我评语大全
2014/04/18 职场文书
病危通知书样本
2015/04/17 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA
vue实现在data里引入相对路径
2022/06/05 Vue.js