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 生成目录树及显示文件大小的代码
Jul 23 Python
python计算最大优先级队列实例
Dec 18 Python
python检测远程端口是否打开的方法
Mar 14 Python
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
Python自定义类的数组排序实现代码
Aug 28 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
tensorflow输出权重值和偏差的方法
Feb 10 Python
Python面向对象总结及类与正则表达式详解
Apr 18 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
python实现差分隐私Laplace机制详解
Nov 25 Python
Python基本知识点总结
Apr 07 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
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
JavaScript中Object和Function的关系小结
2009/09/26 Javascript
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
详解create-react-app 自定义 eslint 配置
2018/06/07 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
Django与JS交互的示例代码
2017/08/23 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
详解用python写一个抽奖程序
2019/05/10 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
Python调用C/C++的方法解析
2020/08/05 Python
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
2014年小学教师工作总结
2014/11/10 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
信用卡工作证明范本
2015/06/19 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL