Python 多线程
一、线程的使用
需导入模块: from threading import Thread
二、基本使用
def fun1(arg1, v):
print(arg1) print('before')
t1 = Thread(target=fun1, args=('aaa',11,))
t1.start()
print('此线程名称:', t1.getName()) t2 = Thread(target=fun1, args=('bbb',22,))
t2.start()
print('此线程名称:', t2.getName()) print('after')
三、常用方法
- start
- getName()
- setName()
- isDaemon()
- setDaemon()
- join(timeout)
- run()
def fun2():
for i in range(100):
print(i)
time.sleep(1) print('start')
t1 = Thread(target=fun2)
print('是否守护线程:', t1.isDaemon()) #默认为False,自动执行
#设置为守护线程,不自动执行,主程序执行完则子线程不执行,
#主程序如果没执行完,则子线程随着主程序执行,直至主程序结束,子线程也跟着结束
t1.setDaemon(True)
t1.start()
print('after1')
print('after2')
print('after3')
time.sleep(10)
def fun1():
for i in range(10):
print(i)
time.sleep(1) print('before')
t1 = Thread(target=fun1)
t1.start()
# t1.join() #主程序执行到join()这里后挺住开始执行子线程,子线程执行结束后主程序继续执行
t1.join(5) #最多等5秒,子线程最多执行5秒后主进程继续向下执行,主程序执行结束后,子线程继续执行 print('after')
四、自定义线程类
class MyThread(Thread):
def run(self):
time.sleep(3)
print('我是线程')
Thread.run(self) #如果不加此句,则不会执行自定义线程中的函数 def Bar():
print('bar') t1 = MyThread(target=Bar)
t1.start()
print('over')
五、自定义线程类应用 -- 生产者消费者模型
#!/usr/bin/env python
# -*- coding:utf-8 -*- from queue import Queue
from threading import Thread
import time
import random class Producer(Thread):
def __init__(self, name, queue):
'''
生产者初始化
:param name:生产者名称
:param queue:容器
'''
self.__Name = name
self.__Queue = queue
super(Producer, self).__init__() #调用父类构造方法 def run(self):
while True:
if self.__Queue.full():
time.sleep(random.randrange(5))
else:
self.__Queue.put('包子')
time.sleep(random.randrange(5))
print('%s %s 生产了一个包子' %(self.__Name, time.strftime('%Y-%m-%d %H:%M:%S')))
# Thread.run(self) class Customer(Thread):
def __init__(self, name, queue):
'''
消费者初始化
:param name:消费者名称
:param queue: 容器
'''
self.__Name = name
self.__Queue = queue
super(Customer, self).__init__() def run(self):
while True:
# print('qsize=',self.__Queue.qsize())
if self.__Queue.empty():
time.sleep(random.randrange(5))
else:
self.__Queue.get_nowait()
time.sleep(random.randrange(3))
print('%s %s 消费了一个包子,还剩%d个包子' %(self.__Name, time.strftime('%Y-%m-%d %H:%M:%S'), self.__Queue.qsize()))
# Thread.run(self) que = Queue(maxsize=100) # print(que.qsize()) liFu = Producer('李师傅', que)
liFu.start() zhangFu = Producer('张师傅', que)
zhangFu.start() wangFu = Producer('王师傅', que)
wangFu.start() for item in range(20):
name = '陈涛%d' %(item,)
temp = Customer(name, que)
temp.start() # print(que.qsize()) # print(que.qsize())
# que.put('1')
# que.put('2')
# print('empty: ', que.empty())
# print(que.qsize())
# que.get()
# que.get()
# print('empty: ', que.empty())
六、函数编程实现生产者消费者模型
#!/usr/bin/env python
# -*- coding:utf-8 -*- import time
import threading
import random
import queue def Producer(name, que):
while True:
if que.qsize()<3:
que.put('包子')
print('%s 生产了一个包子' % name)
else:
print('还有3个包子')
time.sleep(random.randrange(2)) def Customer(name, que):
while True:
try:
que.get_nowait()
print('%s 消费了一个包子' % name)
except Exception:
print('没有包子了...')
time.sleep(random.randrange(3)) que = queue.Queue(100) xf1 = threading.Thread(target=Producer,args=('师傅1',que))
xf1.start()
xf2 = threading.Thread(target=Producer,args=('师傅2',que))
xf2.start() xli = threading.Thread(target=Customer,args=('小李',que))
xli.start()
xzh = threading.Thread(target=Customer,args=('小张',que))
xzh.start()
七、线程锁
#!/usr/bin/evn python
# -*- coding:utf-8 -*- import threading
import time num = 0 def fun1(n):
time.sleep(1)
global num
lock.acquire() # 需要锁,会独占CPU的操作,此句应放在对数据操作的时候
num += 1
lock.release() #释放锁,对数据操作完后要把锁释放掉,在没有释放前,不可以再添加需要锁
# time.sleep(0.01) 如果还有sleep一会,则表示此时不需CPU处理,则下面的print就不会按顺序输出
print(num) #如果释放锁后直接print,则是CPU锁定刚结束,还占用着CPU,则会按顺序输出 lock = threading.Lock() #线程锁 for i in range(100):
t = threading.Thread(target=fun1, args=('n',))
t.start()
八、递归线程锁 #一般不常用
#!/usr/bin/evn python
# -*- coding:utf-8 -*- import threading
import time num = 0
num2 = 0 def fun1(n):
time.sleep(1)
global num
global num2
lock.acquire() # 需要锁,会独占CPU的操作,此句应放在对数据操作的时候
num += 1
lock.acquire() #使用递归锁就可以在锁内嵌套锁
num2 += 1
lock.release() #使用递归锁必须要把请求道的锁这个释放
lock.release()
print(num, num2) lock = threading.RLock() #线程锁 for i in range(100):
t = threading.Thread(target=fun1, args=('n',))
t.start()
九、同时进行多个线程
#!/usr/bin/evn python
# -*- coding:utf-8 -*- import threading
import time num = 0 def fun1(n):
time.sleep(1)
global num
samp.acquire() # 需要锁,会独占CPU的操作,此句应放在对数据操作的时候
num += 1
print(num)
samp.release() #释放锁,对数据操作完后要把锁释放掉,在没有释放前,不可以再添加需要锁 # lock = threading.Lock() #线程锁
samp = threading.BoundedSemaphore(5) #设置此锁最多同时可以几个进行进行数据修改 for i in range(200):
t = threading.Thread(target=fun1, args=('n',))
t.start()
十、线程间的信息交互
#/usr/bin/env python
# -*- coding:utf-8 -*- import threading
import time def producer():
print('收银员等人来买包子')
event.wait() #等待消息变化,等待有进程执行set()返回True
event.clear() #等到set()变成True了,则恢复set()的状态 print('收银员:有人来买包子')
print('收银员:给他做一个包子')
time.sleep(3) print('收银员:给你包子')
event.set() def customer():
print('张三来买包子')
event.set() time.sleep(1)
print('张三:等待取包子') event.wait()
event.clear()
print('张三:谢谢') event = threading.Event() #线程间可以互通消息的变量 kf = threading.Thread(target=producer)
kf.start()
zs = threading.Thread(target=customer)
zs.start()
Python 多线程的更多相关文章
- python多线程学习记录
1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...
- python多线程编程
Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- python多线程
python多线程有两种用法,一种是在函数中使用,一种是放在类中使用 1.在函数中使用 定义空的线程列表 threads=[] 创建线程 t=threading.Thread(target=函数名,a ...
- python 多线程就这么简单(转)
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- python 多线程就这么简单(续)
之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...
- python多线程监控指定目录
import win32file import tempfile import threading import win32con import os dirs=["C:\\WINDOWS\ ...
- python多线程ssh爆破
python多线程ssh爆破 Python 0x01.About 爆弱口令时候写的一个python小脚本,主要功能是实现使用字典多线程爆破ssh,支持ip表导入,字典数据导入. 主要使用到的是pyth ...
- 【python,threading】python多线程
使用多线程的方式 1. 函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...
- <转>Python 多线程的单cpu与cpu上的多线程的区别
你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...
随机推荐
- 项目中创建单元测试—VS2012
我们在每个项目的开发过程中,开发完一个功能,自己首先需要测试一下,VS提供了很方便的测试功能,可以很容易的创建单元测试,但是在VS2012中类名上点击右键没有『创建单元测试』这个菜单,需要先进行设置一 ...
- Hello Point——WebGL
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 《深入浅出Node.js》第6章 理解 Buffer
@by Ruth92(转载请注明出处) 第6章 理解 Buffer ✁ 为什么需要 Buffer? 在 Node 中,应用需要处理网络协议.操作数据库.处理图片.接收上传文件等,在网络流和文件的操作中 ...
- Bullet的学习资源(用Doxygen生成API文档)
Bullet 全称 Bullet Physics Library,是著名的开源物理引擎(可用于碰撞检测.刚体模拟.可变形体模拟),这里将bullet的学习资源整理一下,希望能帮助入门者少走弯路. 看下 ...
- js获取url的常用方法
//设置或获取对象指定的文件名或路径. console.log(window.location.pathname) //设置或获取整个 URL 为字符串. console.log(window.loc ...
- Codeforces Round #379 (Div. 2) A B C D 水 二分 模拟
A. Anton and Danik time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- find和grep的区别
find命令:在系统当中搜索符合条件的文件名,如果需要匹配,使用通配符匹配,通配符是完全匹配. grep命令:在文件当中搜索符合条件的字符串,如果需要匹配,使用正侧表达式匹配 正侧表达式是包含匹配.
- rigidbody2D.velocity 提示缺少using?用的unity5?
请用 GetComponent<Rigidbody2D>().velocity
- java异常知识点整理
异常处理机制:捕获异常(try-catch-finally)和声明抛弃异常(throw); 所有的异常类都直接或者间接地继承于Throwable类: java异常分为可查异常和不可查异常两种.可查异常 ...
- NLP概述
1,词法分析 待续 2,文本分类 文本表示: 重点是贝叶斯模型:二项表示法和多项表示法.(向量维度为词库大小,一个是01,一个是频次).模型重点在于化后验为先验. 还有其他模型:机器学习模型,分布式模 ...