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 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...
随机推荐
- Model--汇总
NSFileManager.NSURL.NSFileHandle.NSData.NSXMLParser.NSUserDefaults.NSKeyedArchiver.NSKeyedUnarchiver ...
- 论文ei,sci检索,JCR-SCI分区,中科院分区连接
https://jcr.incites.thomsonreuters.com/JCRJournalHomeAction.action?SID=B1-bQgax2FJ7EsyZ9muP6O5loc77S ...
- boost array使用
#include <iostream> #include<boost/array.hpp> int main() { boost::array<int, 6> ar ...
- JS中this的值到底为何?
之前很久的时间,因为研究不深,对于this的值一直模模糊糊,不是很清楚,最近有空做了一些研究,终于彻底弄明白了this到底为何物. 首先, 先抛出一个定论:”在Javascript中,this关键字永 ...
- LintCode Palindrome Partitioning II
Given a string s, cut s into some substrings such that every substring is a palindrome. Return the m ...
- 【转】JavaScript获取节点类型、节点名称和节点值
DOM节点信息包括节点类型(nodeType).节点名称(nodeName)和节点值(nodeValue). 节点类型 DOM节点中,每个节点都拥有不同的类型.W3C规范中常用的 DOM节点类型有以下 ...
- Web集群缓存一致性的思考
共享cache+数据库实现缓存一致性: 1.1 memcache + mongo+定时器 1.1.1 memcache 优点:web集群共享数据 缺点:数据生命周期的不可预估性 1.1.2 mongo ...
- 获取应用程序信息.h
//// 获取应用程序信息.h// IOS笔记// 一般会用来判断是否有新版本.是否需要强制更新 iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中ta ...
- 前端学习 第三弹: JavaScript语言的特性与发展
前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...
- 移动端 touch 事件的originalEvent
对于移动端的触摸事件,我们通过touchstart.touchmove.touchend实现,PC端一般使用mousedown.mousemove.mouseup实现. 我们获取事件坐标,原生js获取 ...