首页 > 编程语言 >Python 多线程中的 Join Lock 和 Event

Python 多线程中的 Join Lock 和 Event

时间:2023-02-21 22:37:45浏览次数:32  
标签:set start Python Lock threading 线程 print 多线程 event

Join 函数的作用

Join 函数的作用主要是提供当前线程阻塞,等待线程结束后,在执行下一个线程,保护线程通畅有序执行

如下当没有使用 join 时,主线程结束了子线程还在运行


def doWaiting1():
    print('start waiting1: ' + time.strftime('%H:%M:%S') + "\n")
    time.sleep(3)
    print("线程1奉命报道")
    print('stop waiting1: ' + time.strftime('%H:%M:%S') + "\n")
def doWaiting2():
    print('start waiting2: ' + time.strftime('%H:%M:%S') + "\n")
    time.sleep(8)
    print("线程2奉命报道")
    print('stop waiting2: ', time.strftime('%H:%M:%S') + "\n")

# 创建并开启线程1
thread1 = threading.Thread(target = doWaiting1)
thread1.start()
# thread1.join()

# 创建并开启线程2
thread2 = threading.Thread(target = doWaiting2)
thread2.start()
# thread2.join()

# 计时程序
print('start join: ' + time.strftime('%H:%M:%S')  )
print('end join: ' + time.strftime('%H:%M:%S') )
start waiting1: 20:44:06

start waiting2: 20:44:06
start join: 20:44:06

end join: 20:44:06
线程1奉命报道
stop waiting1: 20:44:09

线程2奉命报道
stop waiting2:  20:44:14

Lock 的作用

在同一进程下的线程间资源是共享的,使用线程锁可以有效的保护共享资源。资源共享意味着所有线程均可以修改资源,而线程的执行是抢占式的,cpu执行任务的时候是不定规律执行的,同时会执行多个语句,多个线程在同一个进程中可以并发执行,当第一个线程读取数据时,第二个线程在修改数据,将会导致冲突。如果发生数据修改的操作,为防止数据资源冲突,可以给线程加锁,以保护资源。

线程锁原理:只有当被加锁的线程执行完毕,并释放锁,其他线程才可以对该线程所占用的资源进行操作使用

如下当不设进程锁时,会出现打印错乱,就是因为进程之间抢占资源造成的


lock = threading.Lock()

def add1():
    global a
    # lock.acquire()
    for i in range(10000):
        a = a+1
        print(a)
    # lock.release()

def add2():
    global a
    # lock.acquire()
    for i in range(10000):
        a = a+1
        print(a)
    # lock.release()

a = 1
t1 = threading.Thread(target=add1, )
t2 = threading.Thread(target=add1, )
t1.start()
t2.start()

Event 的使用

set() — 全局内置标志Flag,将标志Flag 设置为 True,通知在等待状态(wait)的线程恢复运行;

isSet() — 获取标志Flag当前状态,返回True 或者 False;

wait() — 一旦调用,线程将会处于阻塞状态,直到等待其他线程调用set()函数恢复运行;

clear() — 将标志设置为False;

Event 可以用来控制一个线程中不同子功能的开启,也可以用来实现两个线程之间的联动,即一个线程满足某种条件触发另外一个线程功能的启动


import threading
from time import sleep

event = threading.Event()

def test(n):
    while not event.is_set():
        print('event is not set')
        sleep(1)
    event.wait()
    while event.is_set():
        print('event is set')
        sleep(1)

if __name__ == '__main__':
    t = threading.Thread(target=test, args=(1, ))
    t.start()
    sleep(3)
    print('----- event is set -----')
    event.set()
    sleep(3)
    print('----- event is clear -----')
    event.clear()
event is not set
event is not set
event is not set
----- event is set -----
event is set
event is set
event is set
----- event is clear -----

生产者与消费之--Event版

# -*- coding:utf-8 -*-
import threading
import time
import queue


event = threading.Event()
goods = queue.Queue(5)
num = 0


class Producer(threading.Thread):
    def run(self):
        global num
        while True:
            if goods.empty():
                event.clear()
                for _ in range(5):
                    goods.put('商品-' + str(num))
                    print('生产了商品-{0}.'.format(str(num)))
                    num += 1
                    time.sleep(1)
                event.set()


class Customer(threading.Thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.money = 7

    def run(self):
        while self.money:
            event.wait()
            self.money -= 1
            print('{0} 买了一个{1}.'.format(
                threading.current_thread().name, goods.get()))
            time.sleep(1)
        print('{0}没钱了,回家.'.format(threading.current_thread().name))


if __name__ == '__main__':
    p = Producer(daemon=True)
    c1 = Customer(name='Alice')
    c2 = Customer(name='Bob')
    c2.start()
    p.start()
    c1.start()
    c1.join()
    c2.join()

标签:set,start,Python,Lock,threading,线程,print,多线程,event
From: https://www.cnblogs.com/cokefentas/p/17142492.html

相关文章

  • python-基础:线程
    3.线程安全一个线程中可以有多个子线程,且线程可以共享进程中所有的资源多个线程去操作一份资源,高概率性的发生数据混乱的情况,如下:示例importthreadingloop=1000......
  • python-requests出现InsecureRequestWarning错误
    使用Python3requests库发送HTTPS请求,verify=False已经关闭认证情况下,控制台会输出以下warning在代码中添加以下内容即可requests.packages.urllib3.disable_warnings()......
  • python+playwright 学习-5.new_context上下文与新窗口操作
    前言browser.new_context()创建一个新的浏览器上下文。它不会与其他浏览器上下文共享cookies/缓存。浏览器上下文使用browser.new_context()创建context对象,context......
  • QPython实例03-制作【ONE一个】可视化应用
    一、前言QPython3c在大佬的改进下,拥有了基于sl4a的FullScreenWrapper2全屏框架。文章将用该框架制作我们的可视化应用【ONE一个】。二、最终效果如下三、准备工作AI......
  • Python paramiko的简单使用
    paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方式。可以实现远程命令执行、文件传输、中间SSH代理等功能,相对于Pexpect,封装的层次更高,更贴近SSH协议的功......
  • python学习——【第十一弹】
    前言上一篇文章 ​​python学习——【第十弹】​​中介绍了python中类的相关属性和方法,这篇文章接着学习python中的浅拷贝,下一篇文章为大家介绍深拷贝。简单了解浅拷贝......
  • 【多线程】定位线程死锁
    定位线程死锁的方式jstackpid使用arthas写一个死锁的小例子importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.CountDownLatch;imp......
  • Java多线程技能-线程的启动
    java多线程技能技术点:线程的启动如何使线程暂停如何使线程停止线程的优先级线程安全相关的问题进程和线程的定义及多线程的优点进程:进程是受操作系统管理的基本......
  • Redis IO多线程的简要测试结果
    RedisIO多线程的简要测试结果摘要最近想简单确认一下IO多线程的对吞吐量的提升情况.正好手头有鲲鹏的机器,所以想直接进行一下验证顺便用一下4216进行一下对比.......
  • 继承Thread开启多线程下载图片(不推荐,java的单一继承性)
    packagecom.Java;importorg.apache.commons.io.FileUtils;importjava.io.File;importjava.io.IOException;importjava.net.URL;//练习多线程Thread,实现多线程下载图片......