python threading模块操作多线程介绍


Posted in Python onApril 08, 2015

python是支持多线程的,并且是native的线程。主要是通过thread和threading这两个模块来实现的。thread是比较底层的模块,threading是对thread做了一些包装的,可以更加方便的被使用。这里需要提一下的是python对线程的支持还不够完善,不能利用多CPU,但是下个版本的python中已经考虑改进这点,让我们拭目以待吧。

    threading模块里面主要是对一些线程的操作对象化了,创建了叫Thread的class。一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的class里。我们来看看这两种做法吧。

#-*- encoding: gb2312 -*-
import string, threading, time

def thread_main(a):
  global count, mutex
  # 获得线程名
  threadname = threading.currentThread().getName()
  
  for x in xrange(0, int(a)):
    # 取得锁
    mutex.acquire()
    count = count + 1
    # 释放锁
    mutex.release()
    print threadname, x, count
    time.sleep(1)
  
def main(num):
  global count, mutex
  threads = []
  
  count = 1
  # 创建一个锁
  mutex = threading.Lock()
  # 先创建线程对象
  for x in xrange(0, num):
    threads.append(threading.Thread(target=thread_main, args=(10,)))
  # 启动所有线程
  for t in threads:
    t.start()
  # 主线程中等待所有子线程退出
  for t in threads:
    t.join() 
  
  
if __name__ == '__main__':
  num = 4
  # 创建4个线程
  main(4)

上面的就是第一种做法,这种做法是很常见的,下面是另一种,曾经使用过Java的朋友应该很熟悉这种模式:

#-*- encoding: gb2312 -*-
import threading
import time

class Test(threading.Thread):
  def __init__(self, num):
    threading.Thread.__init__(self)
    self._run_num = num
  
  def run(self):
    global count, mutex
    threadname = threading.currentThread().getName()
  
    for x in xrange(0, int(self._run_num)):
      mutex.acquire()
      count = count + 1
      mutex.release()
      print threadname, x, count
      time.sleep(1)

if __name__ == '__main__':
  global count, mutex
  threads = []
  num = 4
  count = 1
  # 创建锁
  mutex = threading.Lock()
  # 创建线程对象
  for x in xrange(0, num):
    threads.append(Test(10))
  # 启动线程
  for t in threads:
    t.start()
  # 等待子线程结束
  for t in threads:
    t.join()
Python 相关文章推荐
详解Python中的__init__和__new__
Mar 12 Python
Python contextlib模块使用示例
Feb 18 Python
python分布式环境下的限流器的示例
Oct 26 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
Dec 31 Python
我就是这样学习Python中的列表
Jun 02 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
Feb 07 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
Apr 01 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
解析python 类方法、对象方法、静态方法
Aug 15 Python
python 星号(*)的多种用途
Sep 21 Python
Python3使用tesserocr识别字母数字验证码的实现
Jan 29 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 #Python
python中Genarator函数用法分析
Apr 08 #Python
探索Python3.4中新引入的asyncio模块
Apr 08 #Python
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 #Python
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 #Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 #Python
在Python中使用M2Crypto模块实现AES加密的教程
Apr 08 #Python
You might like
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php实现读取内存顺序号
2015/03/29 PHP
PHP查看当前变量类型的方法
2015/07/31 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
React 父子组件通信的实现方法
2019/12/05 Javascript
JavaScript实现手风琴效果
2021/02/18 Javascript
python对字典进行排序实例
2014/09/25 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
应届毕业生求职信范例分享
2013/12/17 职场文书
大学生村官任职感言
2014/01/09 职场文书
农村婚礼证婚词
2014/01/10 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
亮剑观后感
2015/06/05 职场文书
毕业证明书
2015/06/19 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL