简要讲解Python编程中线程的创建与锁的使用
创建线程 setDeamon(),设置线程为deamon线程,必须在start()调用前调用,默认为非demon。 threading.currentthread(),用来获得当前的线程; #coding:utf-8 import threading def func1(num): for i in range(num): #threading.currentThread()获取当前线程,getName()获取线程名字 print 'I am %s.num:%s' % (threading.currentThread().getName(),i) def main(thread_num): thread_list = [] #定义一个线程列表 for i in range(thread_num): thread_list.append(threading.Thread(target=func1,args = (3,))) for a in thread_list: #a.setDaemon(True)这个setDaemon默认为False 非守护线程 #表示主线程等所有子线程结束后,在结束 #设置为True的话 表示是个守护线程 子线程就会随着主线程的结束而结束 #听说服务监控工具生成的心跳线程 就是用的守护线程 a.start() for a in thread_list: a.join() #表示等待直到线程运行完毕 main(3) 运行结果 I am Thread-1.num:0 I am Thread-1.num:1 I am Thread-1.num:2 I am Thread-2.num:0 I am Thread-2.num:1 I am Thread-2.num:2 I am Thread-3.num:0 I am Thread-3.num:1 I am Thread-3.num:2 2,直接从threading.Thread继承,然后重写__init__方法和run方法 #coding:utf-8 import threading class MyThread(threading.Thread): #继承父类threading.Thread def __init__(self,num ): threading.Thread.__init__(self) self.num = num #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 def run(self): for i in range(self.num): print 'I am %s.num:%s' % (self.getName(),i) for i in range(3): t = MyThread(3) t.start() t.join() 运行结果 I am Thread-1.num:0 I am Thread-1.num:1 I am Thread-1.num:2 I am Thread-2.num:0 I am Thread-2.num:1 I am Thread-2.num:2 I am Thread-3.num:0 I am Thread-3.num:1 I am Thread-3.num:2
import threading # 导入threading模块 import time # 导入time模块 class mythread(threading.Thread): # 通过继承创建类 def __init__(self,threadname): # 初始化方法 # 调用父类的初始化方法 threading.Thread.__init__(self,name = threadname) def run(self): # 重载run方法 global x # 使用global表明x为全局变量 for i in range(3): x = x + 1 time.sleep(2) # 调用sleep函数,让线程休眠5秒 print x tl = [] # 定义列表 for i in range(10): t = mythread(str(i)) # 类实例化 tl.append(t) # 将类对象添加到列表中 x=0 # 将x赋值为0 for i in tl: i.start() # 依次运行线程 [root@localhost ~]# python syn.py 30 30 30 30 30 30 30 30 30 30 由于x是全局变量(共享资源),每个线程对x操作后就休眠了 使用互斥锁来保护公共资源。用互斥锁来保证同一时刻只有一个线程访问公共资源,实现简单的同步 import threading # 导入threading模块 import time # 导入time模块 class mythread(threading.Thread): # 通过继承创建类 def __init__(self,threadname): # 初始化方法 threading.Thread.__init__(self,name = threadname) def run(self): # 重载run方法 global x # 使用global表明x为全局变量 lock.acquire() # 调用lock的acquire方法 for i in range(3): x = x + 1 time.sleep(2) # 调用sleep函数,让线程休眠5秒 print x lock.release() # 调用lock的release方法 lock = threading.Lock() # 类实例化 tl = [] # 定义列表 for i in range(10): t = mythread(str(i)) # 类实例化 tl.append(t) # 将类对象添加到列表中 x=0 # 将x赋值为0 for i in tl: i.start() # 依次运行线程 [root@localhost ~]# python syn.py 3 6 9 12 15 18 21 24 27 30 可重入锁:threading.RLock() lock = threading.Lock() 修改为: lock = threading.RLock() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python – 我怎么能实现像np.where这样的东西([‘value1′
- python – 使用Django的ORM的模型继承方法
- python – 基于权重着色networkx边缘
- Python基于PycURL自动处理cookie的方法
- Python 的开发效率真的比 Java高吗?
- python使用paramiko模块实现ssh远程登陆上传文件并执行
- 【Django】ORM操作#1 -- 2019-08-17 06:19:12
- 我有一个很长的元组列表,我需要排序,例如. [(’12 / 2010′
- Python技术栈与Spark交叉数据分析双向整合技术实战!
- python-3.x – 绘图时的Matplotlib索引错误