• 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方法之间。"
  • 相关阅读:
    转:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
    Grid组件 列头居中
    XAML文档基础
    WPF框架之MVVM系列(一)
    WPF 树型控件(TreeView)
    WPF自定义控件开发
    ASP.NET MVC系列一:Global.asax用法分析
    WPF基础系列之 控件与布局
    WPF 自定义控件基类
    DbTool验证码
  • 原文地址:https://www.cnblogs.com/eilinge/p/9527867.html
Copyright © 2020-2023  润新知