python多线程锁有没有优先级别_Python多线程解读【七日打卡】

线程讲解

多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。

用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。

程序的运行速度可能加快。

在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程的上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。线程可以被抢占(中断)。

在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。

线程可以分为:内核线程:由操作系统内核创建和撤销。

用户线程:不需要内核支持而在用户程序中实现的线程。

线程中常用的两个模块为:_thread

threading(推荐使用)

thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 "_thread"。

开始学习Python线程

Python中使用线程有两种方式:函数或者用类来包装线程对象。

函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下:_thread.start_new_thread ( function, args[, kwargs] )复制代码

参数说明:function - 线程函数。

args - 传递给线程函数的参数,他必须是个tuple类型。

kwargs - 可选参数。

实例:#!/usr/bin/python3

import _thread

import time

# 为线程定义一个函数

def print_time( threadName, delay):

count = 0

while count 

time.sleep(delay)

count += 1

print ("%s: %s" % ( threadName, time.ctime(time.time()) ))

# 创建两个线程

try:

_thread.start_new_thread( print_time, ("Thread-1", 2, ) )

_thread.start_new_thread( print_time, ("Thread-2", 4, ) )

except:

print ("Error: 无法启动线程")

while 1:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python多线程编程中,(Lock)和可重入(RLock)都是常用的同步机制,用于保护共享资源,防止多个线程同时访问导致数据错误。 Lock是一种最基本的,它将资源住,直到被释放。当一个线程获得时,其他线程必须等待该线程释放后才能获得。这种是不可重入的,即同一个线程不能重复获得同一把。 RLock是可重入,它允许一个线程多次获得同一把。当一个线程获得时,它可以再次获得这个而不会被阻塞。只有该线程释放的次数与获得的次数相等时,其他线程才能获得该。可重入在需要多次获得同一把的场景中很有用。 下面是使用Lock和RLock的示例代码: ```python import threading # 创建一个Lock对象 lock = threading.Lock() # 创建一个RLock对象 rlock = threading.RLock() # 使用Lock保护共享资源 class Counter(object): def __init__(self): self.value = 0 def increment(self): lock.acquire() try: self.value += 1 finally: lock.release() # 使用RLock保护共享资源 class ReentrantCounter(object): def __init__(self): self.value = 0 def increment(self): rlock.acquire() try: self.value += 1 # 再次获得 rlock.acquire() try: self.value += 1 finally: rlock.release() finally: rlock.release() ``` 在上面的代码中,Counter类使用Lock保护value属性,而ReentrantCounter类使用RLock保护value属性。在increment方法中,Counter使用lock.acquire()和lock.release()获取和释放,在同一时间只允许一个线程访问value属性。而ReentrantCounter使用rlock.acquire()和rlock.release()获取和释放,并且在方法内部重复获得,这是RLock的特性。 需要注意的是,使用时要避免死的情况发生,即多个线程相互等待对方释放的情况。因此,在编写代码时要考虑好的获取和释放顺序,以避免死的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值