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编写批量卸载手机中安装的android应用脚本
Jul 21 Python
Python使用Redis实现作业调度系统(超简单)
Mar 22 Python
python实现汉诺塔算法
Mar 01 Python
python 使用值来排序一个字典的方法
Nov 16 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
python标准库os库的函数介绍
Feb 12 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
matplotlib 多个图像共用一个colorbar的实现示例
Sep 10 Python
Python机器学习三大件之一numpy
May 10 Python
python 如何做一个识别率百分百的OCR
May 29 Python
python代码实现备忘录案例讲解
Jul 26 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+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
Angular使用ng-messages与PHP进行表单数据验证
2016/12/28 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
python Django模板的使用方法(图文)
2013/11/04 Python
Python实现获取网站PR及百度权重
2015/01/21 Python
python常见排序算法基础教程
2017/04/13 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
Python configparser模块应用过程解析
2020/08/14 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
外贸采购员求职的自我评价
2013/11/26 职场文书
大学活动策划书范文
2014/01/10 职场文书
服务承诺书怎么写
2014/05/24 职场文书
2014年检验员工作总结
2014/11/19 职场文书
2014年测量员工作总结
2014/12/12 职场文书
详解python字符串驻留技术
2021/05/21 Python
Java8中Stream的一些神操作
2021/11/02 Java/Android
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL
正则表达式基础与常用验证表达式
2022/06/16 Javascript