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的Django框架中的templates设置
May 11 Python
Python简明入门教程
Aug 04 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
基于h5py的使用及数据封装代码
Dec 26 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
Django项目uwsgi+Nginx保姆级部署教程实现
Apr 19 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
Jul 13 Python
python之随机数函数的实现示例
Dec 30 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
DIY实用性框形天线
2021/03/02 无线电
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
2014年人民警察入党思想汇报
2014/10/12 职场文书
领导干部考核评语
2015/01/04 职场文书
python中pymysql包操作数据库方法
2022/04/19 Python