python--threading

Posted on 2018-08-24 09:17  eilinge  阅读(179)  评论(0编辑  收藏  举报

  有一段时间没来博客了,前一个星期没能从分手中走出来,心里很是落寞,没有学习的劲;第二个星期,由于要忙着在公司升级系统,所以就把学习给荒废了。还好皇天不负有心人,我开始了自己读书之后《我的人生,我在乎》,遇到困难保持乐观的心态,失恋都没能把我击垮,还有什么难事!就这样,工作这边的事情通过自己的努力,已经得到很大的改观,保持积极向上的心态,不断成长自己。

好了,废话不多说,让我们开始正题。是关于多线程: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方法之间。"