Python中多线程thread与threading的实现方法


Posted in Python onAugust 18, 2014

学过Python的人应该都知道,Python是支持多线程的,并且是native的线程。本文主要是通过thread和threading这两个模块来实现多线程的。

python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用。

这里需要提一下的是python对线程的支持还不够完善,不能利用多CPU,但是下个版本的python中已经考虑改进这点,让我们拭目以待吧。

threading模块里面主要是对一些线程的操作对象化了,创建了叫Thread的class。

一般来说,使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里。

我们来看看这两种做法吧。

一、Python thread实现多线程

#-*- 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)

二、Python threading实现多线程

#-*- 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程序设计能够起到一定的借鉴价值。

Python 相关文章推荐
pyqt4教程之实现windows窗口小示例分享
Mar 07 Python
Python中的map、reduce和filter浅析
Apr 26 Python
Python中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
跟老齐学Python之玩转字符串(3)
Sep 14 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
python机器学习案例教程——K最近邻算法的实现
Dec 28 Python
python使用sqlite3时游标使用方法
Mar 13 Python
python3下实现搜狗AI API的代码示例
Apr 10 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
在Pandas中处理NaN值的方法
Jun 25 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
Apr 20 Python
Python使用函数默认值实现函数静态变量的方法
Aug 18 #Python
Python中正则表达式的用法实例汇总
Aug 18 #Python
python中enumerate的用法实例解析
Aug 18 #Python
Python采用raw_input读取输入值的方法
Aug 18 #Python
Python中Collection的使用小技巧
Aug 18 #Python
Python实现3行代码解简单的一元一次方程
Aug 18 #Python
Python统计列表中的重复项出现的次数的方法
Aug 18 #Python
You might like
我常用的几个类
2006/10/09 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
python代码制作configure文件示例
2014/07/28 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
python中调试或排错的五种方法示例
2019/09/12 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
如何基于python实现脚本加密
2019/12/28 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
销售人员中英文自荐信
2013/09/22 职场文书
大学生军训自我评价分享
2013/11/09 职场文书
销售文员的岗位职责
2013/11/20 职场文书
两年的个人工作自我评价
2014/01/10 职场文书
周年庆典主持词
2014/04/02 职场文书
销售口号大全
2014/06/11 职场文书
十佳家长事迹材料
2014/08/26 职场文书
教师辞职书范文
2015/02/26 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
ORACLE中dbms_output.put_line输出问题的解决过程
2022/06/28 Oracle