进程与线程的区别:
进程不共享空间,线程共享地址空间 线程共享空间优缺点:
优点:多线程给用户的体验好些,打开时占用的内存比进程少
缺点:共享地址空间会相互干扰,甚至有影响
 import threading
import time class Mythreading(threading.Thread):
def __init__(self,threadID,name,counter):
threading.Thread.__init__(self) #固定格式
self.threadID = threadID
self.name = name
self.counter = counter
print("初始化完成")
def run(self): #由cpu来处理决定线程间的执行顺序
print("开始"+self.name)
print_time(self.name,self.counter,)
print("结束"+self.name) def print_time(threasName,counter,delay):
while counter:
time.sleep(delay)
print("%s:%s"%(threasName,time.ctime(time.time())))
counter -= #创建线程
thread1 = Mythreading(,"thread1",)
thread2 = Mythreading(,"thread2",) #开启线程
thread1.start()
thread2.start()
 import threading
import time class Mythreading(threading.Thread):
def __init__(self,threadID,name,counter):
threading.Thread.__init__(self) #固定格式
self.threadID = threadID
self.name = name
self.counter = counter
print("初始化完成")
def run(self): #由cpu来处理决定线程间的执行顺序
threadLock.acquire() #获得锁,成功获得锁定后返回True,可选的参数timeout不填时将一直阻塞直到获得锁定
print_time(self.name,self.counter,)
threadLock.release() #释放锁,开始下一个线程 def print_time(threasName,counter,delay):
while counter:
time.sleep(delay)
print("%s:%s"%(threasName,time.ctime(time.time())))
counter -= threadLock = threading.Lock()
threads = [] #创建线程
thread1 = Mythreading(,"thread1",)
thread2 = Mythreading(,"thread2",) #开启线程
thread1.start()
thread2.start() # thread1.join()
# thread2.join()
threads.append(thread1)
threads.append(thread2)
for t in threads:
t.join() #后边的代码必须等待,等线程运行完成才会往后运行代码 print("我的的花儿也谢了")

为什么下图左为串行,下图右为并行运行呢?

图左love启动后分别执行start和join,启动了join后边代码就需要等待前边代码运行完成。总共18s

图右同时启动love和hate,运行所需要执行的时间然后停止。总共10s

超级播放器示例,如下:

 import threading
from time import sleep, ctime
def music(func):
for i in range():
print ("I was listening to %s! %s" %(func,ctime()))
sleep()
def move(func):
for i in range():
print ("I was at the %s! %s" %(func,ctime()))
sleep() def player(name):
r = name.split('.')[]
if r=="mp3":
music(name)
elif r=="mp4":
move(name)
else:
print("%s is error!"%name) lists = ["love.mp3","hate.mp4","cuicui.mp3","nnnn.mp4"] threads = []
files = range(len(lists))
for i in files:
t = threading.Thread(target=player,args=(lists[i],))
threads.append(t) if __name__ == '__main__':
for i in files:
threads[i].start()
for i in files:
threads[i].join()
print ('all end: %s' %ctime())

生产者与消费者示例:

 import threading
class Produce(threading.Thread): def __init__(self,name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global x
tt.acquire()
if x > : print("我不生产了")
else:
for i in range():
x +=
print("%s在生产中,第%d个"%(self.name,x))
tt.release() class Consume(threading.Thread):
def __init__(self,name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global x
tt.acquire()
if x == : print("我不消费了")
else:
for i in range():
x -=
print("%s在消费中,第%d个"%(self.name,x+))
tt.release()
x =
tt = threading.Lock()
# tt = threading.Condition p = Produce("produce")
c = Consume("consume") p.start()
c.start() p.join()
c.join()

python自动化--语言基础线程、生产者消费者示例的更多相关文章

  1. Python自动化--语言基础7--操作日志、加密、发送邮件、线程、生产者消费者

    1.操作日志 logging.basicConfig:日志的统一处理器,对日志的输出格式和方式做配置日志级别等级CRITICAL > ERROR > WARNING > INFO & ...

  2. Python自动化--语言基础8--接口请求及封装

    基于http协议,最常用的是GET和POST两种方法. 接口文档需要包含哪些信息: 接口名称接口功能接口地址支持格式 json/xml请求方式请求示例请求参数(是否必填.数据类型.传递参数格式)返回参 ...

  3. Python自动化--语言基础5--面向对象、迭代器、range和切片的区分

    面向对象 一.面向对象代码示例: 1 class Test(): #类的定义 2 car = "buick" #类变量,定义在类里方法外,可被对象直接调用,具有全局效果 3 def ...

  4. Python自动化--语言基础4--模块、文件读写、异常

    模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...

  5. python自动化--语言基础四模块、文件读写、异常

    模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...

  6. Python自动化--语言基础6--模块操作之re、MySQL、Excel

    1.Python自有模块正则 import re # re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None print(re.match("aaa ...

  7. Python自动化--语言基础3--字典、函数、全局/局部变量

    字典 dict1 = {'name':'han','age':18,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values ...

  8. Python自动化--语言基础2--运算符、格式化输出、条件语句、循环语句、列表、元组

    运算符包括:算术运算符.比较运算符.赋值运算符.逻辑运算符.成员运算符.身份运算符 算术运算符 %   取模(余数) //  取相除的整数部分 /   (5/2=2.5) 比较运算符 ==  等于 ! ...

  9. python自动化--语言基础1--数据类型及类型转换

    Python中核心的数据类型有哪些?变量(数字.字符串.元组.列表.字典) 什么是数据的不可变性?哪些数据类型具有不可变性数据的不可变是指数据不可更改,比如: a = ("abc" ...

随机推荐

  1. 在GNS3下使用Cisco SDM 的教程

    安装步骤: 1..先安装jre-6u17-windows-i586se (最新版的)如图: 点击安装,直到安装完成. © 2.安装SDM2.5中文版SDM-V25 如图 : 出现欢迎安装向导,点击下一 ...

  2. 总结react中遇到的坑和一些小的知识点

    在使用react 中经常会遇到各种个样的问题,如果对react不熟悉则会对遇到的问题感到莫名其妙而束手无策,接下来分析一下react中容易遇到的问题和注意点. 1.setState()是异步的this ...

  3. canvas.clipPath canvas.clipRect() 无效的原因

    今天发现有些机型不能做到像QQ 透明截图那样的功能,本来能够的.一看是部分机器所有都是灰色半透明遮挡住了,没中间的透明效果,. 并且我不是通过遮挡,我是採用 裁剪的方式,至于裁剪代码百度有相关知识,具 ...

  4. 一张图告诉你是须要 SQL 还是 Hadoop

    译序 非常多朋友问时下如火如荼的 Hadoop 是否适合引进我们自己的项目,什么时候用 SQL.什么时候用 Hadoop,它们之间怎样取舍?Aaron Cordova 用一张图来回答你这个问题,对于不 ...

  5. Dijkstra算法——最短路径(转)

    转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijkstra(迪杰斯 ...

  6. Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的删除办法

    检查linux发现server中的磁盘分区空间超过98%,登录到服务器查看 [root@localhost etc]# df -hFilesystem 容量 已用 可用 已用% 挂载点/dev/hda ...

  7. 编译android的一些坑

    1 降级gcc g++到4.4 2 参考:http://source.android.com/source/initializing.html来配置环境 3 使用jdk1.6 包括 java java ...

  8. Swing的Look And Feel机制研究

    首先,参考了一下这篇文章 里面提到需要自己Override L&F的initClassDefaults方法,但是查看了一下NimbusLookAndFeel, 发现它为了没有实现initCla ...

  9. 解决juqery easyui combobox只能选择问题

    1.首先设定框为 combobox样式,该字段值为了进行值的显示 <tr class="odd_row"> <td class="TableLabel_ ...

  10. 逻辑频道号---DVB NIT LCN

    先介绍NIT,NIT描述如下: 有一点要注意,NIT是对大网的描述,即NIT并不是描述当前的流,而是描述大网的某些或者全部流.如下图,TS流描述1-6共对6个频点不同的TS流进行了描述,具体对哪一个流 ...