程序、进程及线程的区别

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

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

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

1.单线程

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

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

增加循环功能:

  1. from time import sleep, ctime
  2.  
  3. # 听音乐
  4. def music(func, loop):
  5. for i in range(loop):
  6. print('i was listening to music! %s !%s' % (func, ctime()))
  7. sleep(2)
  8.  
  9. # 看电影
  10. def movie(func, loop):
  11. for i in range(loop):
  12. print('i was listening to music! %s !%s' % (func, ctime()))
  13. sleep(5)
  14.  
  15. if __name__ == '__main__':
  16. music('爱情买卖', 2)
  17. movie('一代宗师', 2)
  18. 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. 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. def movie(func, loop):
  12. for i in range(loop):
  13. print('i was listening to music! %s !%s' % (func, ctime()))
  14. sleep(5)
  15.  
  16. # 创建线程数组
  17. threads = []
  18. # 创建线程t1,并添加到线程数组
  19. t1 = threading.Thread(target=music, args=('爱情买卖', 2))
  20. threads.append(t1)
  21. # 创建线程t2,并添加到线程数组
  22. t2 = threading.Thread(target=music, args=('一代宗师', 2))
  23. threads.append(t2)
  24.  
  25. if __name__ == '__main__':
  26. # 启动线程
  27. for t in threads:
  28. t.start()
  29. # 守护线程
  30. for t in threads:
  31. t.join()
  32.  
  33. 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. def super_player(file_, loop):
  6. for i in range(2):
  7. print('start playing: %s !%s' % (file_, ctime()))
  8. sleep(2)
  9. # 播放文件与播放时长
  10. lists = {'爱情买卖.mp3':3,'阿凡达.mp4':5,'传奇.mp3':4}
  11.  
  12. threads = []
  13. files = range(len(lists))
  14. print(files)
  15. # 创建线程
  16. print(lists.items())
  17. for file_,time in lists.items():
  18. t = threading.Thread(target=super_player,args=(file_,time))
  19. print(t)
  20. threads.append(t)
  21.  
  22. if __name__ == '__main__':
  23. # 启动线程
  24. for t in files:
  25. threads[t].start()
  26. # 守护线程
  27. for t in files:
  28. threads[t].join()
  29.  
  30. print(' end:%s'% ctime())

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

创建了一个super_player()函数,这个函数可以接收播放文件和播放时长,可以播放任何文件。

创建了一个lists字典用于存放播放文件名与时长,通过for循环读取字典,并调用super_play()函数创建字典,接着将创建的字典都追加到threads数组中。

最后通过循环启动线程数组threads中的线程。

创建线程类(未懂)

  1. import threading
  2. from time import sleep, ctime
  3.  
  4. # 创建线程类
  5. class MyThread (threading.Thread):
  6. def __init__(self, func, args, name=''):
  7. threading.Thread.__init__ (self)
  8. self.func = func
  9. self.args = args
  10. self.name = name
  11.  
  12. def run(self):
  13. self.func (*self.args)
  14.  
  15. # 创建超级播放器
  16. def super_player(file_, loop):
  17. for i in range (3): # 控制线程的循环次数
  18. print ('start playing: %s !%s' % (file_, ctime ()))
  19. sleep (3) # 每次循环的间接次数
  20.  
  21. # 播放文件与播放时长
  22. lists = {'爱情买卖.mp3': 3, '阿凡达.mp4': 5, '传奇.mp3': 4}
  23.  
  24. threads = []
  25. files = range (len (lists))
  26. print (len (lists))
  27.  
  28. print (files) # 打印的结果是range(0,3)
  29. # 创建线程
  30. print (lists.items ())
  31. for file_, time in lists.items ():
  32. t = threading.Thread (target=super_player, args=(file_, time))
  33. print (t)
  34. threads.append (t)
  35.  
  36. if __name__ == '__main__':
  37. # 启动线程
  38. for t in files:
  39. threads[t].start ()
  40. # 守护线程
  41. for t in files:
  42. threads[t].join ()
  43.  
  44. print (' end:%s' % ctime ())

MyThread(threading.Thread)

创建MyThread类,用于继承threading.Thread类

__init__()类的初始化方法对func,args,name等参数进行初始化。

  1. self.func (*self.args)函数的作用是当函数参数已经存在于一个元组或者字典中时,apply()间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数元组。
    如果省略了args,则任何参数不会被传递,kwargs是一个包含关键字参数的字典。
  2.  
  3. 注:以上内容为转载

selenium+python之python多线程的更多相关文章

  1. python高级之多线程

    python高级之多线程 本节内容 线程与进程定义及区别 python全局解释器锁 线程的定义及使用 互斥锁 线程死锁和递归锁 条件变量同步(Condition) 同步条件(Event) 信号量 队列 ...

  2. python 类变量 在多线程下的共享与释放问题

    最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到 内存释放问题,导致越累越大 1.python 类变量 在多线程情况 下的 是共享的 2.python 类变量 在多线程情况 ...

  3. python中的多线程【转】

    转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...

  4. Python之FTP多线程下载文件之分块多线程文件合并

    Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...

  5. Python之FTP多线程下载文件之多线程分块下载文件

    Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...

  6. Python系列之多线程、多进程

    线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程. Python的标准库提供 ...

  7. Python 简单理解多线程

    进程,是一个或多个线程的集合,每个进程在内存中是相对独立的. 线程,是计算机最小的运算单元,每个进程至少要有一个线程,多个线程时,每个线程间之间共享内存. 分别举例常规运行和多线程运行: 0)常规运行 ...

  8. python中的多线程

    一个程序可以理解为一个进程,这个进程有其代号,可以依据这个代号将其杀死. 一个进程肯定有且只有一个主线程,他可以有很多子线程. 运行一个任务如果可以有许多子线程同时去做,当然会提高效率. 但是,在py ...

  9. python单线程,多线程和协程速度对比

    在某些应用场景下,想要提高python的并发能力,可以使用多线程,或者协程.比如网络爬虫,数据库操作等一些IO密集型的操作.下面对比python单线程,多线程和协程在网络爬虫场景下的速度. 一,单线程 ...

  10. python大法好——多线程

    Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件 ...

随机推荐

  1. DL杂谈

    好久不写了,几点这次项目经验吧,本次训练位多任务训练,主要目的训练人脸角度,具体公司项目不细谈. 讲一下主要碰到的坑: 1 最主要问题,网络结构不对称,导致主任务与辅助任务之间的梯度关系不平衡从而导致 ...

  2. iview组件select之默认展示label,并传空value做方法入参

    要求: 默认查询操作日期在当日的数据:(打开页面时默认选中时间.全部) 后台约定:选定“全部”这个条件,传的值是空"" 综上:使用select选择框的v-model绑定数据,使用: ...

  3. mysql Split函数

    mysql没有split函数,这里手动写一个: ),)) BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS temp_split ( col ) ); DELETE ...

  4. linux 下 .o 文件, .a文件,.so文件的区别

    最近在unbuntu环境下开发代码,由于很少使用linux开发环境,所以对linux编译方面了解更少,关于.o, .a, .so文件和可执行文件一直很困惑 今天特意查了一下关于它们的区分: .o 就相 ...

  5. WP之样式

    1.定义资源 <Window.Resources> <!--下面用样式--> <Style x:Key="BigFontButtonStyle"> ...

  6. SQL Server 截取两个固定字符之间的字符串(案例)

    网上的问题: 参考这篇<函数PARSENAME使用和截取字符串>https://www.cnblogs.com/insus/p/10958452.html 的方法: )='||MO21|T ...

  7. 移动端专用css

    通过设置css属性 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);取消掉手机端webkit浏览器 点击按钮或超链接之类的 默认灰色背景色 设置css属性 ...

  8. unite2017相关

    日程 http://unite2017.csdn.net/ http://www.sohu.com/a/137202360_280780 http://www.gameres.com/750046.h ...

  9. UIPI VS与Win7 共舞:用户界面特权隔离

    http://tech.it168.com/a2009/0924/737/000000737968.shtml [IT168 专稿]在上文中,我们介绍了操作系统服务的Session 0隔离,通过Ses ...

  10. 51nod1107(逆序对数&归并排序)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1107 题意:中文题诶- 思路:通过题意可以发现对于两点p1(x ...