有一段时间没来博客了,前一个星期没能从分手中走出来,心里很是落寞,没有学习的劲;第二个星期,由于要忙着在公司升级系统,所以就把学习给荒废了。还好皇天不负有心人,我开始了自己读书之后《我的人生,我在乎》,遇到困难保持乐观的心态,失恋都没能把我击垮,还有什么难事!就这样,工作这边的事情通过自己的努力,已经得到很大的改观,保持积极向上的心态,不断成长自己。
好了,废话不多说,让我们开始正题。是关于多线程:threading,由于是从别人那里学习的"https://www.cnblogs.com/yeayee/p/4952022.html",加了自己的一些理解,和对获得锁与解锁RLock,Lock知识的简单添加,有了一点疑问:
#-*- coding:utf-8 -*-
from time import ctime,sleep
import threading
class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.func = func
self.args = args
self.name = name
def run(self):
#threadLock.acquire()
apply(self.func,self.args)
#threadLock.release()
def super_player(file,stime):
for i in range(2):
#print 'Start Playing:%s %s'%(file,ctime())
test1(file)
test2(file)
sleep(stime)
def test1(a):
s1 = a * a
print 's1:%s %s'%(s1,ctime())
def test2(a):
s2 = a * a
print 's2:%s %s'%(s2,ctime())
threadLock = threading.RLock()
#list = {'lin.mp3':3,'eilin.mp4':4}
list = {2:3,5:4}
threads = []
for (v,k) in list.items():
t = MyThread(super_player,(v,k),super_player.__name__)
threads.append(t)
if __name__=='__main__':
for i in xrange(len(list)):
threads[i].start()
for i in xrange(len(list)):
threads[i].join()
print 'the end:%s'%ctime()
1.未加锁的运行结果:运行时间:8s
s1:4 Fri Aug 24 09:01:20 2018
s2:4 Fri Aug 24 09:01:20 2018
s1:25 Fri Aug 24 09:01:20 2018
s2:25 Fri Aug 24 09:01:20 2018
s1:4 Fri Aug 24 09:01:23 2018
s2:4 Fri Aug 24 09:01:23 2018
s1:25 Fri Aug 24 09:01:24 2018
s2:25 Fri Aug 24 09:01:24 2018
the end:Fri Aug 24 09:01:28 2018
2.加锁的运行结果:运行时间:14s
s1:4 Fri Aug 24 09:06:18 2018
s2:4 Fri Aug 24 09:06:18 2018
s1:4 Fri Aug 24 09:06:21 2018
s2:4 Fri Aug 24 09:06:21 2018
s1:25 Fri Aug 24 09:06:24 2018
s2:25 Fri Aug 24 09:06:24 2018
s1:25 Fri Aug 24 09:06:28 2018
s2:25 Fri Aug 24 09:06:28 2018
the end:Fri Aug 24 09:06:32 2018
总结:
1.setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。
子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print "all over %s" %ctime()后,没有等待子线程,
直接就退出了,同时子线程也一同结束。
2.join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。
3.ctime():获取当前时间
4.多个线程同时运行,互不影响
5.获取锁threading.Lock().acquire() test1,test2先执行list['2'],再执行list['4']
疑问:
多线程的目的就是为了让多线程能够同时运行,从而减少大量时间;然而加上锁之后,运行时间反而增加了许多?
再看看Lock存在的原因,就懂了
"如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire方法和release方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间。"