码迷,mamicode.com
首页 > 编程语言 > 详细

python学习(三十二)线程锁&守护线程&多进程

时间:2018-05-30 19:25:30      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:结束   UI   python2   start   global   span   打印   修改   16px   

1、线程锁

如果多个线程同时要修改一个数据的时候,可能会把数据覆盖,这个时候就要在改数据的时候加锁,只同时有一个线程在改这个数据,改完后再解锁。

在Python2里面要加锁,在Python3里面不用,因为Python3里面会自动加锁和解锁。

在Python2里面加锁的代码如下:

import threading,time
num=1
lock=threading.Lock() #申请一把锁
def run():
    time.sleep(1)
    global num
    lock.acquire()  #加锁
    num+=1
    lock.release()   #解锁   #在python3里面可以不加,默认会加上的
ts=[]
for  i in range(50):
    t=threading.Thread(target=run)
    t.start()
    ts.append(t)
[t.join() for t in ts]
#如果主线程没有做等待(以上两句),那么最后打印的num值是1,因为打印num的时候,子线程因有sleep时间还没执行完
print(num)

2、守护线程

 把子线程设置为守护线程,那么主线程一旦结束,子线程不管有没有执行完也会结束

import threading,time
def run():
    time.sleep(3)
    print(hhh)

for i in range(50):
    t=threading.Thread(target=run)
    t.setDaemon(True)  #把子线程设置成为守护线程
    t.start()
print(运行完成)  #主线程执行完了,子线程也就结束了,所以只会打印这一句

以上代码,本来在3秒后要输出hhh,结果因为主线程运行完后,还没到3秒,hhh还没打印,子线程也结束了,所以只输出运行完成

如果以上代码主线程在输出运行完成后,等待3秒,那么子线程就可以执行

import threading,time
def run():
    time.sleep(3)
    print(hhh)

for i in range(50):
    t=threading.Thread(target=run)
    t.setDaemon(True)  #把子线程设置成为守护线程
    t.start()
print(运行完成)  #主线程执行完了,子线程也就结束了,所以只会打印这一句
time.sleep(3)  #因为主线程在打印上一句后,等待了3秒,这时候子线程运行完了,所以子线程的内容也会打印

3、多进程

多进程多用于处理CPU密集型任务

多线程多用于处理I/O密集型任务

import multiprocessing,threading
def my():
    print(哈哈哈哈)
def run(num):
    for i in range(num):
        t=threading.Thread(target=my)
        t.start()
if __name__==__main__:
    for i in range(5):
        p=multiprocessing.Process(target=run,args=(6,)) #启动进程
        p.start()

启动进程,每个进程有6个线程,总共5个进程,最后输出30次哈哈哈哈

 

python学习(三十二)线程锁&守护线程&多进程

标签:结束   UI   python2   start   global   span   打印   修改   16px   

原文地址:https://www.cnblogs.com/emilyliu/p/9112471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!