线程之线程的创建,同一进程中线程是数据共享的,解决线程数据安全的办法,进程与线程运行效率的对比,死锁,递归锁,信号量,线程的守护进程...

 

#线程的两种创建方式
import time
from threading import Thread
def func(i):
    time.sleep(0.1)
    print(i)
class myThread(Thread):
    def __init__(self,n):
        super().__init__()
        self.n=n
    def run(self):
        print('n>>>',self.n)


if __name__ == '__main__':
    t=Thread(target=func,args=(1,))
    t.start()
    t2=myThread('傻子')
    t2.start()
    t.join()
    print('主线程结束')
#同一进程下各个线程资源共享
import time
from threading import Thread
from multiprocessing import Process

num = 100
def func():
    global num
    num = 0

if __name__ == '__main__':
    t = Thread(target=func,)
    t.start()
    t.join()
    print(num)
#解决共享数据不安全问题
import time
from threading import Thread,Lock
haha=100
def func(lock):
    global haha
    with lock:#加锁
        num=haha
        num-=1
        haha=num
        time.sleep(0.00001)
if __name__ == '__main__':
    lock=Lock()#同步锁,互斥锁
    lst=[]
    for i in range(10):
        t=Thread(target=func,args=(lock,))#定义线程
        t.start()#开启线程
        lst.append(t)
    [tt.join() for tt in lst]#主线程等子线程完成
    print('haha:',haha)
    print('主进程结束。。。')
#进程与线程运行效率对比

import time
from threading import Thread
from multiprocessing import Process

def func(n):
    num = 0
    for n1 in range(n):
        num += n1
    print('num',num)
if __name__ == '__main__':
    t_s_t = time.time()
    t_list = []
    for i in range(10):
        t = Thread(target=func,args=(10,))
        t.start() #速度非常快
        t_list.append(t)
    [tt.join() for tt in t_list]
    t_e_t = time.time()
    t_dif_t = t_e_t - t_s_t  #获取了线程的执行时间

    p_s_t = time.time() #开始时间
    p_list = []
    for ii in range(10):
        p = Process(target=func,args=(10,))
        p.start()
        p_list.append(p)
    [pp.join() for pp in p_list]
    p_e_t = time.time() #结束时间
    p_dif_t = p_e_t - p_s_t #时间差

    print('线程>>>>',t_dif_t)
    print('进程....',p_dif_t)
    print('主线程结束')
#死锁
import time
from threading import Thread,Lock
def func1(lockA,lockB):
    lockA.acquire()
    print('得到A锁')
    lockB.acquire()
    print('这是func1')
    time.sleep(0.01)
    lockB.release()
    lockA.release()
def func2(lockA,lockB):
    lockB.acquire()
    print('得到B锁')
    lockA.acquire()
    print('这是func2')
    time.sleep(0.01)
    lockA.release()
    lockB.release()
def haha(lockA,lockB):
    func1(lockA,lockB)
    func2(lockA,lockB)
if __name__=="__main__":
    lockA=Lock()
    lockB=Lock()
    t1=Thread(target=haha,args=(lockA,lockB))
    t1.start()
    t2=Thread(target=haha,args=(lockA,lockB))
    t2.start()
    t1.join()
    t2.join()
    print('主线程结束')

  

 

#递归锁,解决线程死锁问题
import time
from threading import Thread,RLock
def func1(lockA,lockB):
    lockA.acquire()
    print('得到A锁')
    lockB.acquire()
    print('这是func1')
    time.sleep(0.01)
    lockB.release()
    lockA.release()
def func2(lockA,lockB):
    lockB.acquire()
    print('得到B锁')
    lockA.acquire()
    print('这是func2')
    time.sleep(0.01)
    lockA.release()
    lockB.release()
def haha(lockA,lockB):
    func1(lockA,lockB)
    func2(lockA,lockB)
if __name__=="__main__":
    lockA=lockB=RLock()
    t1=Thread(target=haha,args=(lockA,lockB))
    t1.start()
    t2=Thread(target=haha,args=(lockA,lockB))
    t2.start()
    t1.join()
    t2.join()
    print('主线程结束')
#信号量
import time
from threading import Thread,Semaphore
def func(semaphore,i):
    semaphore.acquire()
    print(i)
    time.sleep(2)
    semaphore.release()
if __name__=='__main__':
    semaphore=Semaphore(4)
    t_list=[]
    for i in range(10):
        t=Thread(target=func,args=(semaphore,i))
        t.start()
        t_list.append(t)
    [tt.join() for tt in t_list]
    print('主线程结束')
#线程的守护
##守护线程会跟随主线程代码的结束而结束,但是主线程不会结束,主线程会等非守护子线程结束后才结束
import time
from threading import Thread

def func1(n):
    time.sleep(2)
    print(n)
def func2(n):
    time.sleep(1)
    print(n)
if __name__ == '__main__':
    t1=Thread(target=func1,args=('我是子线程1',))
    t1.daemon=True
    t1.start()
    t2=Thread(target=func2,args=('我是子线程2',))
    t2.start()
    print('主线程结束')

  

转载于:https://www.cnblogs.com/PythonMrChu/p/9851345.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值