简要讲解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() (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
