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 相关文章推荐
深入解读Python解析XML的几种方式
Feb 16 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
Python 带有参数的装饰器实例代码详解
Dec 06 Python
Python操作Excel插入删除行的方法
Dec 10 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
Dec 12 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
详解Python3 pandas.merge用法
Sep 05 Python
解决pytorch 交叉熵损失输出为负数的问题
Jul 07 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
Python加载数据的5种不同方式(收藏)
Nov 13 Python
Django框架实现在线考试系统的示例代码
Nov 30 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
通过对服务器端特性的配置加强php的安全
2006/10/09 PHP
PHP stripos()函数及注意事项的分析
2013/06/08 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
php写app用的框架整理
2019/09/29 PHP
在JavaScript中通过URL传递汉字的方法
2007/04/09 Javascript
Jquery 学习笔记(一)
2009/10/13 Javascript
Jquery 扩展方法
2010/05/06 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
两种不同的方法实现js对checkbox进行全选和反选
2014/05/13 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
微信小程序自定义组件
2017/08/16 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
Python运维开发之psutil库的使用详解
2018/10/18 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
大学生毕业自我鉴定范文
2013/11/03 职场文书
简单英文演讲稿
2014/01/01 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
网络技术专业求职信
2014/05/02 职场文书
通信工程专业求职信
2014/06/04 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
委托证明范本
2014/11/25 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
九年级数学教学反思
2016/02/17 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
Python Pygame实战之塔防游戏的实现
2022/03/17 Python
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers