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遍历 truple list dictionary的几种方法总结
Sep 11 Python
微信 用脚本查看是否被微信好友删除
Oct 28 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
Python GUI编程完整示例
Apr 04 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
python脚本开机自启的实现方法
Jun 28 Python
python之生产者消费者模型实现详解
Jul 27 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
python asyncio 协程库的使用
Jan 21 Python
Python基于百度AI实现抓取表情包
Jun 27 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和ACCESS写聊天室(四)
2006/10/09 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
Array对象方法参考
2006/10/03 Javascript
转一个日期输入控件,支持FF
2007/04/27 Javascript
Prototype中dom对象方法汇总
2008/09/17 Javascript
javascript针对DOM的应用分析(四)
2012/04/15 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
Python中for循环控制语句用法实例
2015/06/02 Python
深入浅析Python中的yield关键字
2018/01/24 Python
Python星号*与**用法分析
2018/02/02 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
python实现最长公共子序列
2018/05/22 Python
python实现字符串加密成纯数字
2019/03/19 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
Python 解决相对路径问题:"No such file or directory"
2020/06/05 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
路政管理专业个人自荐信范文
2013/11/30 职场文书
活动总结怎么写
2014/04/28 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers