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 相关文章推荐
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
简述Python中的进程、线程、协程
Mar 18 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
Python学习教程之常用的内置函数大全
Jul 14 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
Jan 15 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
Python for循环中的陷阱详解
Jul 13 Python
将python安装信息加入注册表的示例
Nov 20 Python
Python基于DB-API操作MySQL数据库过程解析
Apr 23 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
详解python3类型注释annotations实用案例
Jan 20 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
DOM XPATH获取img src值的query
2013/09/23 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
jquery 表单进行客户端验证demo
2009/08/24 Javascript
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
js使用递归解析xml
2014/12/12 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
js实现简单的秒表
2020/01/16 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Python+Django搭建自己的blog网站
2018/03/13 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
基于Python实现简单学生管理系统
2020/07/24 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
医学专业毕业生推荐信
2013/11/14 职场文书
教育学习自我评价
2014/02/03 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
教代会开幕词
2015/01/28 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
中学教师读书笔记
2015/07/01 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python