Python threading模块

2种调用方式

直接调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import threading
import time
def sayhi(num): #定义每个线程要运行的函数
    print("running on number:%s" %num)
    time.sleep(3)
if __name__ == '__main__':
    t1 = threading.Thread(target=sayhi,args=(1,)) #生成一个线程实例
    t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一个线程实例
    t1.start() #启动线程
    t2.start() #启动另一个线程
    print(t1.getName()) #获取线程名
    print(t2.getName())

继承式调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import threading
import time
class MyThread(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        self.num = num
    def run(self):#定义每个线程要运行的函数
        print("running on number:%s" %self.num)
        time.sleep(3)
if __name__ == '__main__':
    t1 = MyThread(1)
    t2 = MyThread(2)
    t1.start()
    t2.start()

第二种有点傻

基本语法

is_alive() 当前活跃的线程

例子:

car1 = threading.Thread(target=car,args=('bmw',))
car1.start()
print(car1.is_alive())
if car1.is_alive():print('33')
if not car1.is_alive():print('444')

执行结果:

bmw wait red light
True
33

例子对比:

car1 = threading.Thread(target=car,args=('bmw',))
# car1.start()   注释掉
print(car1.is_alive())
if car1.is_alive():print('33')
if not car1.is_alive():print('444')

执行结果:

False
444

Join ()

等待!其实就wait()。

等待该线程执行完毕

Daemon()

守护进程!有句话怎么说来着!守护进程被吞噬!

# _*_coding:utf-8_*_
import time
import threadingstart_time=time.time()
def run(n):print('[%s]------running----\n' % n)time.sleep(2)print('--done--%s'%n)def run2(n):print('[%s]------running----\n' % n)time.sleep(5)print('--done--%s'%n)
lis_1=[]
t1 = threading.Thread(target=run, args=('run%1',))
t2 = threading.Thread(target=run2, args=('run%2',))lis_1.append(t1)
lis_1.append(t2)
# t2.setDaemon(True)# 将main线程设置为Daemon线程,它做为程序主线程的守护线程,当主线程退出时,m线程也会退出,由m启动的其它子线程会同时退出,不管是否执行完任务
t1.start()
t2.start()
#  看下就懂了,不懂试一试就想起来了
t1.join()
t2.join()print("---end time----",time.time()-start_time)

线程锁(互斥锁Mutex)

lock()

为什么上锁?因为好多线程同时修改一个数据,有先后顺序,有的没干完,就被gil了,所以对修改数据的地方加把锁,保证该数据的正确性!

lock = threading.Lock() #生成全局锁

不带锁例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import time
import threading
def addNum():
    global num #在每个线程中都获取这个全局变量
    print('--get num:',num )
    time.sleep(1)
    num  -=1 #对此公共变量进行-1操作
num = 100  #设定一个共享变量
thread_list = []
for in range(100):
    = threading.Thread(target=addNum)
    t.start()
    thread_list.append(t)
for in thread_list: #等待所有线程执行完毕
    t.join()
print('final num:', num )

带锁例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import time
import threading
def addNum():
    global num #在每个线程中都获取这个全局变量
    print('--get num:',num )
    time.sleep(1)
    lock.acquire() #修改数据前加锁
    num  -=1 #对此公共变量进行-1操作
    lock.release() #修改后释放
num = 100  #设定一个共享变量
thread_list = []
lock = threading.Lock() #生成全局锁
for in range(100):
    = threading.Thread(target=addNum)
    t.start()
    thread_list.append(t)
for in thread_list: #等待所有线程执行完毕
    t.join()
print('final num:', num )

RLock(递归锁)

这个主要针对函数甲里边包涵函数乙,函数乙又有函数丙

绕进去了,很麻烦,用lock的话容易死循环,所以用Rlock,一键上锁,保证不乱。例子看看就好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import threading,time
def run1():
    print("grab the first part data")
    lock.acquire()
    global num
    num +=1
    lock.release()
    return num
def run2():
    print("grab the second part data")
    lock.acquire()
    global  num2
    num2+=1
    lock.release()
    return num2
def run3():
    lock.acquire()
    res = run1()
    print('--------between run1 and run2-----')
    res2 = run2()
    lock.release()
    print(res,res2)
if __name__ == '__main__':
    num,num2 = 0,0
    lock = threading.RLock()
    for in range(10):
        = threading.Thread(target=run3)
        t.start()
while threading.active_count() != 1:
    print(threading.active_count())
else:
    print('----all threads done---')
    print(num,num2)

Semaphore(信号量)

互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import threading,time
def run(n):
    semaphore.acquire()
    time.sleep(1)
    print("run the thread: %s\n" %n)
    semaphore.release()
if __name__ == '__main__':
    num= 0
    semaphore  = threading.BoundedSemaphore(5#最多允许5个线程同时运行
    for in range(20):
        = threading.Thread(target=run,args=(i,))
        t.start()
while threading.active_count() != 1:
    pass #print threading.active_count()
else:
    print('----all threads done---')
    print(num)

Events  

重点,标识符,event可以理解成对全局变量不停的修改,!!!!!!这个我感觉后边能用的到,用event来验证result

语法有

event = threading.Event()

创建标识符

event.set( )

设置标识符

event.wait( )

等待标识符出现,一旦出现立刻执行后边的代码

print(‘杀啊!!’)
event.wait()
print( ‘撤退!!,杀个瘠薄’

event.clear( )

清空标志位

通过Event来实现两个或多个线程间的交互

红绿灯例子!!

import time
import threadingevent=threading.Event()def car(name):while True:if event.is_set():print('%s is runing'%name)time.sleep(1)else:print('%s wait red light' % name)event.wait()time.sleep(1)def light():conent = 0event.set()while True:if conent >5 and conent <10:event.clear()print('\033[41;1mred light is on ....\033[0m')elif conent >10:event.set()conent = 0else:print('\033[42;1mgreen is come!\033[0m')time.sleep(1)conent += 1light = threading.Thread(target=light,)car2 = threading.Thread(target=car,args=('tesla',))car1 = threading.Thread(target=car,args=('bmw',))
light.start()
car1.start()
car2.start()

运行结果

转载于:https://www.cnblogs.com/PYlog/p/9240692.html

线程的语法 (event,重要)相关推荐

  1. 秒杀多线程第六篇 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  2. 孤荷凌寒自学python第四十一天python的线程同步之Event对象

    孤荷凌寒自学python第四十一天python的线程同步之Event对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 鉴于Lock锁与RLock锁均宣告没有完全完成同步文件操作的问题,于是 ...

  3. Windows多线程(四) 经典线程同步 事件Event

    第一个 CreateEvent 函数功能:创建事件 函数原型: HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes, BOOLbManu ...

  4. 经典线程同步 事件Event

    Event 内核对象,实际上是解决线程同步问题的利器. 介绍下函数应用: 第一个 CreateEvent 函数功能:创建事件 函数原型: HANDLECreateEvent( LPSECURITY_A ...

  5. 线程同步 -事件Event、临界区对象CriticalSection

    事件Event: 基本函数: 全局对象:HANDLE g_hEvent 创建事件对象:g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL) 重置状态为无信号:Rese ...

  6. python线程安全的计数器_Python多线程同步Lock、RLock、Semaphore、Event实例

    一.多线程同步 由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的资源.大部分情况都推荐使用多进程. python的多线程的 ...

  7. python中event_Python Event实现线程通信

    Event是一种非常简单的线程通信机制,一个线程发出一个 Event,另一个线程可通过该 Event 被触发. Event 本身管理一个内部旗标,程序可以通过 Event 的 set() 方法将该旗标 ...

  8. 以下会使线程进入到阻塞状态的是_Python并行编程(五):多线程同步之event(事件)...

    什么是事件? 事件在内部管理了一个标志Flag,如果Flag值为 False,那么线程在执行event.wait方法时就会阻塞等值直到Flag值为True,该线程便会顺利执行,而Flag的值是通过ev ...

  9. python queue死锁_Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue...

    一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...

最新文章

  1. 宁波Uber优步司机奖励政策(1月18日~1月24日)
  2. python详细安装教程3.7.4-python 3.7.4下载与安装的问题
  3. [leetcode]203. Remove Linked List Elements链表中删除节点
  4. 关于如何使用反编译器,获取源码清单
  5. Class类中的getEnclosing*、getDeclared*与getDeclaringClass的区别
  6. cigarettes(香烟)
  7. 博科查看光功率_法拉第旋光器:非互易性旋转光的偏振
  8. 1. UI Tests简介
  9. 性能测试之JMeter取样器详解:sampler
  10. createEventObject 与 createEvent EDIT WATCH
  11. Linux内核探索之路——关于书
  12. java武士风度_CH2906 武士风度的牛(算竞进阶习题)
  13. 网站视频链接自动提取下载
  14. CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scen 论文阅读
  15. 滑动t检验在matlab上的实现
  16. 成功制作海报的十个简单法则
  17. 用认真的态度面对人生用心的思考
  18. 神舟战神Z8-CA5NP,RTX3060怎么样?测评值得买吗?详细性能点评
  19. 什么是黑盒测试和白盒测试、灰盒测试?
  20. linux系统四个组成部分,Linux系统由哪几部分组成?系统详解(干货)

热门文章

  1. 全国计算机等级考试题库二级C操作题100套(第63套)
  2. 全国计算机等级考试题库二级C操作题100套(第10套)
  3. 什么是字节码,采用字节码的好处是什么
  4. 信息系统管理整体管理过程
  5. @PostConstruct注解学习,最详细的分享教程
  6. img=img%3e128 matlab,Matlab中一般的数值计算和使用
  7. 电脑知识:分享实用的电脑维护小常识
  8. 事务管理基础:数据库的并发控制相关知识笔记
  9. 2018实用前端面试问题集锦
  10. 常用的几个JavaScript调试技巧