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  __getattr__与__setattr__使用方法
Sep 06 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
python 接收处理外带的参数方法
Dec 03 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
利用python numpy+matplotlib绘制股票k线图的方法
Jun 26 Python
python实现静态服务器
Sep 05 Python
Python如何使用字符打印照片
Jan 03 Python
pandas数据处理之绘图的实现
Jun 15 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
python实现学员管理系统(面向对象版)
Jun 05 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和XSS跨站攻击的防范
2007/04/17 PHP
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
如何实现JS函数的重载
2006/09/22 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
Python ZipFile模块详解
2013/11/01 Python
Python实现把utf-8格式的文件转换成gbk格式的文件
2015/01/22 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Python字典实现伪切片功能
2020/10/28 Python
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
Shell脚本如何向终端输出信息
2014/04/25 面试题
新领导上任欢迎词
2014/01/13 职场文书
货车司机岗位职责
2014/03/18 职场文书
诚信贷款承诺书
2014/05/30 职场文书
人代会标语
2014/06/30 职场文书
国庆庆典邀请函
2015/02/02 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript