python多线程操作实例


Posted in Python onNovember 21, 2014

一、python多线程

因为CPython的实现使用了Global Interpereter Lock(GIL),使得python中同一时刻只有一个线程在执行,从而简化了python解释器的实现,且python对象模型天然地线程安全。如果你想你的应用程序在多核的机器上使用更好的资源,建议使用multiprocessing或concurrent.futures.processpoolexecutor。但是如果你的程序是IO密集型,则使用线程仍然是很好的选择。

二、python多线程使用的两种方法

实例:

import threading

import time
def worker(num):

  print (threading.currentThread().getName() + ' start') 

  time.sleep(10)

  print (threading.currentThread().getName() + ' running')

  print (threading.currentThread().getName() + " " + str(num))

  print (threading.currentThread().getName() + ' exit')

  

def deamon():

  print (threading.currentThread().getName() + ' start')

  time.sleep(20)

  print (threading.currentThread().getName() + ' running')

  print (threading.currentThread().getName() + ' exit')

  

print(threading.currentThread().getName())
d = threading.Thread(name='deamon', target=deamon)

d.setDaemon(True)

d.start()
w = threading.Thread(name='worker', target=worker, args=(10,))

w.start()
class myWorker(threading.Thread):

    def __init__(self, num):  

        threading.Thread.__init__(self)  

        self.num = num  

        self.thread_stop = False  

   

    def run(self): 

        print (self.getName()+' start')

        time.sleep(30)

        print (self.getName()+' running')

        print (self.getName()+" " + str(self.num))

        print (self.getName()+' exit')

 

mw = myWorker(30)

mw.setName("MyWorker")

mw.start()
print(threading.currentThread().getName())
print("All threads:")

print("------------")

for th in threading.enumerate():

  print(th.getName())

print("------------")
d.join()

w.join()

mw.join()
print(threading.currentThread().getName())

运行结果如下:

python多线程操作实例

1)python线程使用的两种方法:

**直接调用threading.Thread来构造thread对象,Thread的参数如下:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}) 
group为None;
target为线程将要执行的功能函数;
name为线程的名字,也可以在对象构造后调用setName()来设定;
args为tuple类型的参数,可以为多个,如果只有一个也的使用tuple的形式传入,例如(1,);
kwargs为dict类型的参数,也即位命名参数;

**实现自己的threading.Thread的子类,需要重载__init__()和run()。

2)threading.Thread对象的其他方法:

start(),用来启动线程;
join(), 等待直到线程结束;
setDeamon(), 设置线程为deamon线程,必须在start()调用前调用,默认为非demon。
注意: python的主线程在没有非deamon线程存在时就会退出。

3)threading的静态方法:

threading.current_thread() , 用来获得当前的线程;
threading.enumerate() , 用来多的当前存活的所有线程;
threading.Timer 定时器,其实是thread的一个字类型,使用如下:

def hello(): print("hello, world")   

t = Timer(30.0, hello) 

t.start()

4)logging是线程安全的

logging 模块是线程安全的,所以可以使用logging来帮助调试多线程程序。

import logging

logging.basicConfig(level=logging.DEBUG,

format="(%(threadName)-10s : %(message)s",

)

logging.debug("wait_for_event_timeout starting")
Python 相关文章推荐
python将ansible配置转为json格式实例代码
May 15 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
Python+matplotlib实现华丽的文本框演示代码
Jan 22 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
Python流程控制 while循环实现解析
Sep 02 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
Python通过两个dataframe用for循环求笛卡尔积
Apr 29 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 Python
Python爬虫基础之简单说一下scrapy的框架结构
Jun 26 Python
Python可视化学习之seaborn绘制矩阵图详解
Feb 24 Python
Python中的闭包详细介绍和实例
Nov 21 #Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 #Python
python多进程操作实例
Nov 21 #Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 #Python
Python多进程同步Lock、Semaphore、Event实例
Nov 21 #Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 #Python
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 #Python
You might like
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
PHP7如何开启Opcode打造强悍性能详解
2018/05/11 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
python循环监控远程端口的方法
2015/03/14 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
使用Pycharm分段执行代码
2020/04/15 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
银行实习生的自我评价
2013/12/09 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
酒店开业主持词
2015/07/02 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
学校学期工作总结
2015/08/13 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技
Pillow图像处理库安装及使用
2022/04/12 Python
处理canvas绘制图片模糊问题
2022/05/11 Javascript
nginx rewrite功能使用场景分析
2022/05/30 Servers