一、线程的使用

需导入模块: 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 多线程的更多相关文章

  1. python多线程学习记录

    1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...

  2. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  3. Python 多线程教程:并发与并行

    转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...

  4. python多线程

    python多线程有两种用法,一种是在函数中使用,一种是放在类中使用 1.在函数中使用 定义空的线程列表 threads=[] 创建线程 t=threading.Thread(target=函数名,a ...

  5. python 多线程就这么简单(转)

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  6. python 多线程就这么简单(续)

    之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...

  7. python多线程监控指定目录

    import win32file import tempfile import threading import win32con import os dirs=["C:\\WINDOWS\ ...

  8. python多线程ssh爆破

    python多线程ssh爆破 Python 0x01.About 爆弱口令时候写的一个python小脚本,主要功能是实现使用字典多线程爆破ssh,支持ip表导入,字典数据导入. 主要使用到的是pyth ...

  9. 【python,threading】python多线程

    使用多线程的方式 1.  函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...

  10. <转>Python 多线程的单cpu与cpu上的多线程的区别

    你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...

随机推荐

  1. PLS-00306错误

    ORA-06550: line 1, column 7:PLS-00306: wrong number or types of arguments in call to 'P'ORA-06550: l ...

  2. Nginx下css的链接问题

    放在 Nginx 下的网页代码,在链接外部 css 文件时,可能出现没有链接成功的问题.需要在 nginx.conf 里的 http 下添加一行. http { include mime.types;

  3. CSS---解决内容过多就会出文本溢出(显示在区域外面,不换行的情况)

    当我们设置我的的div,或者其它文本框固定宽度之后,文本内容过多就会出文本溢出(显示在区域外面,不换行的情况). 这时我们可以使用Css中的几个属于来解.有以下的三个属于可以解决问题: 1,word- ...

  4. ubuntu12.04静态ip设置问题

    由于linux知识不是学的很深,所以仅代表我自己的设置成功总结. 第一步是设置/etc/network/interfaces 增加静态ip设置 auto eth0iface eth0 inet sta ...

  5. applicationCache对象

    applicationCache对象代表了本地缓存,可以在js中进行一些操作.可以用它来通知用户本地缓存中已经被更新,也允许用户手工更新本地缓存.applicationCache.addEventLi ...

  6. [NOIP2011] 观光公交(贪心)

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  7. HTTP Code

    所有 HTTP 状态代码及其定义. 代码  指示  2xx  成功  200  正常:请求已完成.  201  正常:紧接 POST 命令.  202  正常:已接受用于处理,但处理尚未完成.  20 ...

  8. Hibernate4.1之后关于占位符的问题

    hibernate 4.1之后对于HQL中查询参数的占位符做了改进,如果仍然用老式的占位符会有类似如下的告警信息 [main] WARN [org.hibernate.hql.internal.ast ...

  9. 如何让Notepad++添加Python运行方式.精讲

    原文来自金石开的文章,欲知详情请点击他昵称. 名为cncyber的博友,在此感谢他. 全部省略.正确命令是在原文的回复里,在此复制贴上: cmd /k cd /d "$(CURRENT_DI ...

  10. JS关于时间的计算

    用javascript返回两个时间差,精确到秒:     Date.diff = function(a,b){        if(a instanceof Date && b.ins ...