首页 > 编程语言 > 详细

python学习笔记(62) Treading模块

时间:2018-11-28 00:09:36      阅读:207      评论:0      收藏:0      [点我收藏+]

默认情况下主线程会等待子线程结束

t.deamon = Ture  # 主线程结束,子线程随之结束

 

守护进程随着主进程代码的执行结束而结束

守护线程会在主线程结束以后等待其他子线程的结束才结束

 

主进程在执行完自己的代码以后(守护进程结束)不会立即结束,而是等待子进程结束以后,回收子进程资源

主线程必须在其他非守护线程运行完毕以后才能结束(守护进程此时结束),因为主线程的结束意味着进程的结束,进程整体的资源都将被回收

联想join()

 

################################################

进程锁并不常用,一般用线程锁

科学家吃面问题(死锁)

GIL锁是加给线程,并不能完全保证数据安全(时间线轮转)

Lock()  # 互斥锁

Rlock()  # 递归锁,拿几个钥匙加几把锁,在同一线程可以拿多次,为解决死锁问题

fork_lock() = noodle_lock() = Rlock()

################################################

信号量Semaphore()

事件Event()

import time
import random
from threading import Thread,Event

def connect_db(e):
count = 0
while count < 3:
e.wait(1) # 等待1秒
if e.is_set():
print(‘连接数据库中...‘)
break
else:
count += 1
print(‘第%s次失败...‘%count)
else:
raise TimeoutError(‘数据库连接超时‘)

def check_web(e):
time.sleep(random.randint(0,3))
e.set()

e = Event()
t1 = Thread(target=connect_db,args=(e,))
t2 = Thread(target=check_web,args=(e,))
t1.start()
t2.start()

###############################################

 

Condition  # 条件,一种更复杂的锁

c.acquire()

c.release()

c.wait()

c.notify(int)  # 造一次性钥匙

wait和notify必须都在ac和re之间

from threading import Thread,Condition

def func(con,i):
con.acquire()
con.wait()
print(‘在第%s个循环里‘%i)
con.release()



con = Condition()
for i in range(10):
Thread(target=func,args=(con,i)).start()

while True:
num = int(input(‘>>>‘))
con.acquire()
con.notify(num)
con.release()

###############################################

定时器 Timer

Timer(2,func).start()  #延时2秒开启

 

python学习笔记(62) Treading模块

原文:https://www.cnblogs.com/farion/p/10029843.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!