码迷,mamicode.com
首页 > 编程语言 > 详细

selenium+python之python多线程

时间:2017-11-19 17:23:50      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:java   进制   使用   条件   处理   轨迹   super   一个   nbsp   

程序、进程及线程的区别

计算机程序是磁盘中可执行的二进制数据(或者其他类型)他们只有在被读取到内存中,被操作系统调用才开始他们的生命周期。

进程是程序的一次执行,每个进程都有自己的地址空间,内存,数据栈,以及其他记录其运行轨迹的辅助数据,操作系统管理再其上面运行的所有进程,并为这些进程公平得分配时间。

线程与进程相似,不同的是所有的线程都运行在同一个进程中,共享相同的运行环境。

 

1.单线程

单线程时,当处理器需要处理多个任务时,必须对这些任务安排执行的顺序,并按照这个顺序来执行任务。

 1 from time import sleep, ctime
 2 
 3 
 4 # 听音乐
 5 def music():
 6     print(i was listening to music! %s % ctime())
 7     sleep(2)
 8 
 9 
10 # 看电影
11 def movie():
12     print(i was at the movies! %s % ctime())
13     sleep(5)
14 
15 
16 if __name__ == __main__:
17     music()
18     movie()
19     print(all end:, ctime())

增加循环功能:

 1 from time import sleep, ctime
 2 
 3 
 4 # 听音乐
 5 def music(func, loop):
 6     for i in range(loop):
 7         print(i was listening to music! %s !%s % (func, ctime()))
 8         sleep(2)
 9 
10 
11 # 看电影
12 def movie(func, loop):
13     for i in range(loop):
14         print(i was listening to music! %s !%s % (func, ctime()))
15         sleep(5)
16 
17 
18 if __name__ == __main__:
19     music(爱情买卖, 2)
20     movie(一代宗师, 2)
21     print(all end:, ctime())

给music()和movie()两个函数设置参数:播放文件和播放次数。函数中通过for循环控制播放的次数。

2、多线程

python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的,原始的线程以及一个简单的锁。threading基于Java的线程模型设计。锁(lock)和条件变量(condition)在Java中时对象的基本行为(每个对象都自带了锁和条件变量),而在python中则是独立的对象。

(1)threading模块

避免使用thread模块,原因是它不支持守护线程。当主线程退出时,所有的子线程不关他们是否还在工作,都会被强行退出。但是我们并不希望发生这种行为。就要引入守护线程的概念。threading支持守护线程。

 1 from time import sleep, ctime
 2 import threading
 3 
 4 
 5 # 听音乐
 6 def music(func, loop):
 7     for i in range(loop):
 8         print(i was listening to music! %s !%s % (func, ctime()))
 9         sleep(2)
10 
11 
12 # 看电影
13 def movie(func, loop):
14     for i in range(loop):
15         print(i was listening to music! %s !%s % (func, ctime()))
16         sleep(5)
17 
18 
19 # 创建线程数组
20 threads = []
21 # 创建线程t1,并添加到线程数组
22 t1 = threading.Thread(target=music, args=(爱情买卖, 2))
23 threads.append(t1)
24 # 创建线程t2,并添加到线程数组
25 t2 = threading.Thread(target=music, args=(一代宗师, 2))
26 threads.append(t2)
27 
28 if __name__ == __main__:
29     # 启动线程
30     for t in threads:
31         t.start()
32     # 守护线程
33     for t in threads:
34         t.join()
35 
36     print(all end:, ctime())

注:import threading: 引入线程模块

       threads = []:创建线程数组,用于装载线程。

       threading.Thread(): 通过调用threading模块的Thread()方法来创建线程。

运行结果如下:

技术分享图片

从上面运行的结果可以看出,两个子线程(music,movie)同时启动于10分15秒,知道所有线程结束于10分17秒共好使2秒。从执行的结果可以看出两个线程达到了并行工作。

优化线程的创建

从上面例子中发现线程的创建很麻烦,每创建一个线程都需要一个t(t1,t2.。。。。)当创建的线程较多时,这样的操作及其的不方便。

 1 from time import sleep, ctime
 2 import threading
 3 
 4 
 5 # 创建超级播放器
 6 def super_player(file_, loop):
 7     for i in range(2):
 8         print(start playing: %s !%s % (file_, ctime()))
 9         sleep(2)
10 # 播放文件与播放时长
11 lists = {爱情买卖.mp3:3,阿凡达.mp4:5,传奇.mp3:4}
12 
13 threads = []
14 files = range(len(lists))
15 print(files)
16 # 创建线程
17 print(lists.items())
18 for file_,time in lists.items():
19     t = threading.Thread(target=super_player,args=(file_,time))
20     print(t)
21     threads.append(t)
22 
23 if __name__ == __main__:
24     # 启动线程
25     for t in files:
26         threads[t].start()
27     # 守护线程
28     for t in files:
29         threads[t].join()
30 
31     print( end:%s% ctime())

 技术分享图片

 

selenium+python之python多线程

标签:java   进制   使用   条件   处理   轨迹   super   一个   nbsp   

原文地址:http://www.cnblogs.com/fengyiru6369/p/7860291.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!