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入门教程
Apr 03 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
浅谈python3发送post请求参数为空的情况
Dec 28 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
python遍历路径破解表单的示例
Nov 21 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 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
一个php作的文本留言本的例子(二)
2006/10/09 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
修复ie8&chrome下window的resize事件多次执行
2011/10/20 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
JS验证码实现代码
2017/09/14 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
python分割列表(list)的方法示例
2017/05/07 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
abstract class和interface有什么区别?
2012/01/03 面试题
2015年环卫工作总结
2015/04/28 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
pandas提升计算效率的一些方法汇总
2021/05/30 Python
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers