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 23 Python
Python3.2中Print函数用法实例详解
May 19 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
Python基于回溯法子集树模板解决全排列问题示例
Sep 07 Python
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
Python中turtle作图示例
Nov 15 Python
Python实现Selenium自动化Page模式
Jul 14 Python
python 进程池pool使用详解
Oct 15 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
Jan 12 Python
Django项目如何正确配置日志(logging)
Apr 29 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
回答PHPCHINA上的几个问题:URL映射
2007/02/14 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
JS画线(实例代码)
2013/11/20 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
jquery实现鼠标拖动图片效果示例代码
2014/01/09 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
Python 给屏幕打印信息加上颜色的实现方法
2019/04/24 Python
简单了解Python生成器是什么
2019/07/02 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
问卷调查计划书
2014/01/10 职场文书
孝老爱亲模范事迹
2014/01/24 职场文书
给市场的环保建议书
2014/05/14 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
离婚被告答辩状
2015/05/22 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
创业计划书之寿司
2019/07/19 职场文书