设为首页 加入收藏

TOP

第三十三天- 线程创建、join、守护线程、死锁(一)
2018-12-03 22:08:40 】 浏览:197
Tags:三十三天 线程 创建 join 守护 死锁

 

1.线程,线程创建

  概念:在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线。流水线的工作需要电源,电源就相当于cpu。

  所以,进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位

  多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源。

 

  创建:

  线程创建方式一:

 1 from multiprocessing import Process
 2 from threading import Thread
 3 
 4 
 5 def func(n):
 6     print('xxxxx')
 7     print('>>>',n)
 8 
 9 
10 if __name__ == '__main__':
11 
12     # p = Process(target=func,args=(1,))
13     # p.start()
14 
15     t = Thread(target=func,args=(1,))  # 直接创建
16     t.start()
17 
18     print('主线程结束')
View Code

  面向对象创建:

 1 from threading import Thread
 2 
 3 
 4 # 面向对象创建
 5 class Mythread(Thread):  # 继承Thread父类
 6 
 7     def __init__(self,xx):
 8         super().__init__()
 9         self.xx = xx
10 
11     def run(self):  # 必须有run,覆盖父类run中的pass
12         print(self.xx)
13         print('我重置父类方法')
14 
15     def func1(self): # 写其他方法
16         print('我是func1')
17 
18 
19 if __name__ == '__main__':
20 
21     t1 = Mythread('xx')
22     t1.start()  # 默认执行run
23     t1.func1()  # 调用其他方法
24 #
25 
26 from multiprocessing import Process
27 from threading import Thread
View Code

 

 

2.Thread类方法

  join方法:

  主线程等待join子线程执行完毕后才执行

 1 import time
 2 from threading import Thread
 3 
 4 
 5 def func(n):
 6     time.sleep(n)
 7     print('我是子线程')
 8 
 9 
10 if __name__ == '__main__':
11 
12     t = Thread(target=func,args=(1,))
13     t.start()
14 
15     t.join() # 等待子线程执行结束
16     print('我是主线程,子线程结束再执行我')
join

  

  其他方法:

 1 ''
 2 Thread实例对象的方法
 3   # isAlive(): 返回线程是否活动的。
 4   # getName(): 返回线程名。
 5   # setName(): 设置线程名。
 6 
 7 threading模块提供的一些方法:
 8   # threading.currentThread(): 返回当前的线程变量。
 9   # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
10   # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
11 '''
 1 import time, threading
 2 from threading import Thread, current_thread
 3 
 4 
 5 def func():
 6     time.sleep(2)
 7     print('子线程,名字是:', current_thread().getName())  # 返回线程名
 8     print('子线程,ID是:', current_thread().ident)  # 返回线程id
 9 
10 
11 if __name__ == '__main__':
12 
13     for i in range(10):
14         t = Thread(target=func, )
15         t.start()
16 
17     print(threading.enumerate())  # 返回一个包含正在运行的list
18     print(threading.activeCount())  # 返回正在运行的线程数量,等同len(threading.enumerate())
19 
20     print('主线程结束')
其他方法示例

 

 

3.守护线程、事件

  守护线程:

  主进程结束,守护进程跟着结束,再执行非守护进程
  主线程要等待所有非守护线程运行结束才会结束(因为他们属于同一进程)
  需注意:运行结束并非终止运行

  xxx.setDaemon(True)  或者 xxx.daemon = True

 1 import time
 2 from threading import Thread
 3 from multiprocessing import Process
 4 
 5 
 6 def func1():
 7     time.sleep(3)
 8     print('任务1结束')
 9 
10 
11 def func2():
12     time.sleep(2)
13     print('任务2结束')
14 
15 
16 if __name__ == '__main__':
17 
18     # p1 = Process(target=func1,)
19     # p2 = Process(target=func2,)
20     # # p1.daemon = True
21     # p2.daemon = True
22     # p1.start()
23     # p2.start()
24     #
25     # print('主进程结束')
26 
27     t1 = Thread(target=func1,)
28     t2 = Thread(target=func2,)
29     # t1.setDaemon(True) # 只打印出 主线程和t2 因为t2时间比t1小
30     t2.setDaemon(True)  # 会正常打印出所有 因为t1时间大于t2
31     t1.start()
32     t2.start()
33 
34     print('主线程结束')
守护线程与守护进程

  

  事件: 

  event.isSet():返回event的状态值;
  event.wait():如果 event.isSet()==False将阻塞线程;
  event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
  event.clear():恢复event的状态值为False。

 1 import time
 2 from threading import Event
 3 
 4 e = Event()  # 默认false状态
 5 p
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇06 day小数据池 下一篇python小数据池 is和 == 再谈编码

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目