python-threading

馋奶兔 提交于 2019-11-28 01:03:16

借用虫师的多线程示例,了解多线程的概念。

 

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import threading

import time

def music():

    for i in range(1, 3):

        print 'music ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

        time.sleep(10)

        print 'music' + str(i)

 

def sig():

    for i in range(1, 3):

        print 'sig ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

        time.sleep(2)

        print 'sig' + str(i)

 

def thread():

    threads = []

    t1 = threading.Thread(target=music, args=())

    threads.append(t1)

    t2 = threading.Thread(target=sig, args=())

    threads.append(t2)

 

    for t in threads:

        t.start()

    for t in threads:

        t.join()

 

 

if __name__ == '__main__':

    thread()

    print 'xxxxx'

 

# 首先明确jion的作用,是可以控制等待子线程执行完成后,程序才会终止。

# #三种写法:

# 错误方式一:

  for t in threads: 

       t.setDaemon(True)

       t.start()

       t.join()

  join在for循环里面,实际测试结果,还是按照顺序执行,非并发执行。原因:jion放到里面,实际运行是在循环内 非要等到t1子线程执行完成后,才会进行下一步。可增加打印验证

 

#     for t in threads: #         t.setDaemon(True) #         t.start() #         print 'xxxx' #         t.join() #         print 'wwww'

错误方式二:

for t in threads: 

     t.setDaemon(True) 

     t.start()

 

t.join()

 for循环,是只要成功对t赋值,调用music和sig即可,不会关心赋值调用的函数是否运行完成。运行完for循环后,t的值最终是t2,故t2子线程结束后,父线程就会回阻塞。但父线程运行的没有下一个,及join下面是空,所以中止。

 但是t1子线程运行时间大于t2.所以提前中止后,t1就无法执行了

 

 正确方式:

 for t in threads: 

     t.start() 

for t in threads: 

    t.join() 

这个循环只是for循环开启了t1.start\t2.start\t1.join\t2.join,4个函数调用。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!