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字符转换
Sep 06 Python
python根据文件大小打log日志
Oct 09 Python
Python序列之list和tuple常用方法以及注意事项
Jan 09 Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
python文件操作之目录遍历实例分析
May 20 Python
简单解决Python文件中文编码问题
Nov 22 Python
Python常用算法学习基础教程
Apr 13 Python
关于python写入文件自动换行的问题
Jun 23 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 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 强制下载文件实现代码
2013/10/28 PHP
php选择排序法实现数组排序实例分析
2015/02/16 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
js获取变量
2006/08/24 Javascript
js右键菜单效果代码
2007/07/21 Javascript
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
js选项卡的制作方法
2017/01/23 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
2020/12/08 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
新东网科技Java笔试题
2012/07/13 面试题
介绍一下linux的文件系统
2012/03/20 面试题
介绍一下Mysql的存储引擎
2015/02/12 面试题
教师自荐书
2013/10/08 职场文书
法定代表人授权委托书
2014/04/04 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
网络营销计划
2015/01/17 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL
Python数据类型最全知识总结
2021/05/31 Python
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
Android 中的类文件和类加载器详情
2022/06/05 Java/Android