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迭代和迭代器详解
Nov 10 Python
pandas 数据实现行间计算的方法
Jun 08 Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 Python
Python PO设计模式的具体使用
Aug 16 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 Python
python如何爬取网页中的文字
Jul 28 Python
python 读取串口数据的示例
Nov 09 Python
python 实现全球IP归属地查询工具
Dec 18 Python
python利用opencv实现颜色检测
Feb 23 Python
Python爬虫网络请求之代理服务器和动态Cookies
Apr 12 Python
Python中request的基本使用解决乱码问题
Apr 12 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代码优化及php相关问题总结
2006/10/09 PHP
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
PHP中redis的用法深入解析
2014/02/20 PHP
php查询whois信息的方法
2015/06/08 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
python万年历实现代码 含运行结果
2017/05/20 Python
儿童编程python入门
2018/05/08 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
Html5实现二维码扫描并解析
2016/01/20 HTML / CSS
法国房车租赁网站:Yescapa
2019/08/26 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
公务员总结性个人自我评价
2013/12/05 职场文书
后勤服务中心总经理工作职责
2014/03/03 职场文书
投标单位介绍信
2015/05/05 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js