程序、进程及线程的区别

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

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

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

1.单线程

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

 from time import sleep, ctime

 # 听音乐
def music():
print('i was listening to music! %s' % ctime())
sleep(2) # 看电影
def movie():
print('i was at the movies! %s' % ctime())
sleep(5) if __name__ == '__main__':
music()
movie()
print('all end:', ctime())

增加循环功能:

 from time import sleep, ctime

 # 听音乐
def music(func, loop):
for i in range(loop):
print('i was listening to music! %s !%s' % (func, ctime()))
sleep(2) # 看电影
def movie(func, loop):
for i in range(loop):
print('i was listening to music! %s !%s' % (func, ctime()))
sleep(5) if __name__ == '__main__':
music('爱情买卖', 2)
movie('一代宗师', 2)
print('all end:', ctime())

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

2、多线程

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

(1)threading模块

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

 from time import sleep, ctime
import threading # 听音乐
def music(func, loop):
for i in range(loop):
print('i was listening to music! %s !%s' % (func, ctime()))
sleep(2) # 看电影
def movie(func, loop):
for i in range(loop):
print('i was listening to music! %s !%s' % (func, ctime()))
sleep(5) # 创建线程数组
threads = []
# 创建线程t1,并添加到线程数组
t1 = threading.Thread(target=music, args=('爱情买卖', 2))
threads.append(t1)
# 创建线程t2,并添加到线程数组
t2 = threading.Thread(target=music, args=('一代宗师', 2))
threads.append(t2) if __name__ == '__main__':
# 启动线程
for t in threads:
t.start()
# 守护线程
for t in threads:
t.join() print('all end:', ctime())

注:import threading: 引入线程模块

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

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

运行结果如下:

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

优化线程的创建

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

 from time import sleep, ctime
import threading # 创建超级播放器
def super_player(file_, loop):
for i in range(2):
print('start playing: %s !%s' % (file_, ctime()))
sleep(2)
# 播放文件与播放时长
lists = {'爱情买卖.mp3':3,'阿凡达.mp4':5,'传奇.mp3':4} threads = []
files = range(len(lists))
print(files)
# 创建线程
print(lists.items())
for file_,time in lists.items():
t = threading.Thread(target=super_player,args=(file_,time))
print(t)
threads.append(t) if __name__ == '__main__':
# 启动线程
for t in files:
threads[t].start()
# 守护线程
for t in files:
threads[t].join() print(' end:%s'% ctime())

 from time import sleep, ctime
import threading # 创建超级播放器
def super_player(file_, loop):
for i in range(3): # 控制线程的循环次数
print('start playing: %s !%s' % (file_, ctime()))
sleep(3) # 每次循环的间接次数 # 播放文件与播放时长
lists = {'爱情买卖.mp3': 3, '阿凡达.mp4': 5, '传奇.mp3': 4} threads = []
files = range(len(lists))
print(len(lists)) print(files) # 打印的结果是range(0,3)
# 创建线程
print(lists.items())
for file_, time in lists.items():
t = threading.Thread(target=super_player, args=(file_, time))
print(t)
threads.append(t) if __name__ == '__main__':
# 启动线程
for t in files:
threads[t].start()
# 守护线程
for t in files:
threads[t].join() print(' end:%s' % ctime())

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

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

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

创建线程类(未懂)

 import threading
from time import sleep, ctime # 创建线程类
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):
self.func (*self.args) # 创建超级播放器
def super_player(file_, loop):
for i in range (3): # 控制线程的循环次数
print ('start playing: %s !%s' % (file_, ctime ()))
sleep (3) # 每次循环的间接次数 # 播放文件与播放时长
lists = {'爱情买卖.mp3': 3, '阿凡达.mp4': 5, '传奇.mp3': 4} threads = []
files = range (len (lists))
print (len (lists)) print (files) # 打印的结果是range(0,3)
# 创建线程
print (lists.items ())
for file_, time in lists.items ():
t = threading.Thread (target=super_player, args=(file_, time))
print (t)
threads.append (t) if __name__ == '__main__':
# 启动线程
for t in files:
threads[t].start ()
# 守护线程
for t in files:
threads[t].join () print (' end:%s' % ctime ())

MyThread(threading.Thread)

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

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

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

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. IOS要用到的零碎东西

    有些东西虽然不重要,但是零零碎碎会用到,就做个笔录吧: 协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下, 用途在于程序员之间的交流 @required:这个方法必 ...

  2. 【236】◀▶IEW-Unit01

    Unit 1  Fast Food I.动名词的用法 Doing(V-ing) 核心思想:词性是名词,作用是动词 1. 名词 3)主语(句首) 保护环境是我们每个人的责任. Protecting th ...

  3. HashMap的clear方法

    我们都知道HashMap的clear()方法会清楚map的映射关系,至于怎么实现的呢? 下面先看一下clear()方法的源码 public void clear() { Node<K,V> ...

  4. 《深入分析Java Web技术内幕》读后感(Tomcat)

    第11章 P286 Tomcat总体结构 1.service 2.server 3.组件的生命 Connector Container 1.容器的总体设计 2.Engine容器 3.Host容器 4. ...

  5. react中创建组件以及使用

    组件基本使用import React, { Component } from 'react'; // 在组件头部引用 class Home extends Component { // 创建类 ren ...

  6. Search in a Binary Search Tree

    Given the root node of a binary search tree (BST) and a value. You need to find the node in the BST ...

  7. HDU5381【莫队算法+区间GCD特性】

    前言: 主要最近在刷莫队的题,这题GCD的特性让我对莫队的使用也有了新的想法.给福利:神犇的一套莫队算法题 先撇开题目,光说裸的一个莫队算法,主要的复杂度就是n*sqrt(n)对吧,这里我忽略了一个左 ...

  8. 湖南集训day7

    难度:☆☆☆☆☆☆ /* 由观察可知 同种颜色的减去他的父亲值相同 我们考虑把询问的两个数分别减去小于它的最大斐波那契数. */ #include<iostream> #include&l ...

  9. 解决import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;报错的问题

    在项目中用到这两个Jar包,但是程序报错. Access restriction: The type BASE64Decoder is not accessible due to restrictio ...

  10. eclipse for php 开发环境配置

    PHP有非常多相当不错的开发工具,如Zend Studio.NetBeans.phpdesigner等,但对于习惯Java编程的程序员们来说,下面介绍最经常使用的还要属Eclipse. > 我们 ...