zoukankan      html  css  js  c++  java
  • python--threading

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

    好了,废话不多说,让我们开始正题。是关于多线程: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方法之间。"
  • 相关阅读:
    Network Embedding 论文小览
    DLRS(深度学习应用于推荐系统论文汇总--2017年8月整理)
    深度语义匹配模型-DSSM 及其变种
    python 按值排序
    python 日期排序
    推荐领域数据集
    EPS 转 pdf 在线
    梯度下降法的三种形式BGD、SGD以及MBGD
    Daily paper -Science 2006: Experimental Study of Inequality and Unpredictability in an Artificial Cultural Market (探究群体行为对商品销量的影响)
    2017年Nature文章“Millions of online book co-purchases reveal partisan differences in the consumption of science”阅读笔记
  • 原文地址:https://www.cnblogs.com/eilinge/p/9527867.html
Copyright © 2011-2022 走看看