python多线程学习笔记

一:线程相关概念
1.线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程的实际运作单位。
进程与线程的关系:操作系统可以同时执行多个任务,每一个任务就是一个进程,进程可以同时执行多个任务,每个任务就是一个线程
2.多线程类似于同时执行多个不同程序,多线程运行有如下优点:
(1)使用线程可以把占据长时间的程序中的任务放到后台去处理。
(2)用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
(3)程序的运行速度可能加快。
(4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
3.python提供了两个模块来实现多线程thread 和threading。直接使用threading模块的Thread类来创建线程。与多进程类似,也是传入两个属性:target目标函数,args目标函数所需参数。然后调用start( )方法启动线程,调用join( )方法等待线程结束继续执行。

二:线程相关实例
单线程

#coding=utf-8
#单线程
from time import sleep,ctime

def music(m):
        print 'I listen: %s %s' % (m, ctime())
        sleep(3)

def movie(n):
        print 'I watch: %s %s' % (n, ctime())
        sleep(3)


if __name__ == '__main__':
    music('happy')
    movie('life')

多线程

#coding=utf-8
#多线程
import threading
from time import sleep,ctime

def music(func,loop):
    for i in range(loop):
        print 'I listen: %s %s' % (func, ctime())
        sleep(3)

def movie(func,loop):
    for i in range(loop):
        print 'I watch: %s %s' % (func, ctime())
        sleep(3)

#创建线程数组
threads=[]
#创建线程t1,并加到线程数组里
t1=threading.Thread(target=music,args=(u'happy',2))
threads.append(t1)
t2=threading.Thread(target=movie,args=(u'life',2))
threads.append(t2)
#threading.Thread()通过调用threading模块的Thread()方法来创建线程

if __name__ == '__main__':
    # 启动线程
    #start():开始线程进程
    for t in threads:
        t.start()
    #守护线程
    #join()等待线程终止,或者在给了timeout参数时候,等到超时为止
    for t in threads:
        t.join()
    print('all end:',ctime())

线程类

#coding=utf-8
#线程类
import threading
from time import sleep,ctime

#创建线程类
class MyThread(threading.Thread):
    def __init__(self,func,args,name=''):
        threading.Thread.__init__(self)
        self.name=name
        self.func=func
        self.args=args

    def run(self):
        apply(self.func,self.args)

#创建函数判断播放文件的类型
def super_play(file,time):
    for i in range(2):
        print('I watch: %s %s' % (file, ctime()))
        sleep(2)


#创建字典list存放播放的文件与时长
list = {'happy.mp3':2, 'life.mp4':3}

 #创建线程
threads=[]
#len(list)来计算list列表有多少文件,确定循环次数
files=range(len(list))
#先创建字典 list ,用于定义要播放的文件及时长(秒),通过字典的 items()方法来循环的取 file
# 和 time,取到的这两个值用于创建线程。

for file,time in list.items():
    t = MyThread(super_play(file, time), super_play.__name__)
    threads.append(t)


if __name__ == '__main__':
    for i in files:
        threads[i].start()
    for i in files:
        threads[i].join()
    #主线程
    print 'end:%s' %ctime()

    MyThread(threading.Thread)



# __init__() 类的初始化方法对 func、args、name 等参数进行初始化。
# apply() 当函数参数已经存在于一个元组或字典中时,间接地调用函数。args 是一个包含将要提供给
# 函数的按位置传递的参数的元组。如果省略了 args,任何参数都不会被传递,kwargs 是一个包含关键字
# 参数的字典。
# 由于 MyThread 类继承 threading.Thread 类,所以,我们可以使用 MyThread 类来创建线程。

你可能感兴趣的:(python学习,python,多线程,thread)