python锁

锁的概念是因为多线程而提出的,必须在线程中才能体现出锁的作用。

没用锁的情况:

import threading
import time

gl_num = 0

def show(arg):
    global gl_num
    n = gl_num
    time.sleep(1)
    gl_num = n+1
    print(gl_num)

for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

print ('main thread stop')
没用锁的代码
main thread stop
1
1
1
1
1
1
1
1
1
1
运行结果

可以看到,在没用锁的情况下,线程同时取到0并加1,结果都为1.

什么是锁?

  锁,跟门锁一样,他的作用不是为了锁定这个门,而是为了锁定门后的一方世界,也就是代码块。

  

import threading
import time

lock = threading.RLock()
gl_num = 0
def show(arg):
    lock.acquire()
    global gl_num
    n = gl_num
    time.sleep(1)
    gl_num = n+1
    lock.release()
    print(gl_num)

for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

print ('main thread stop')
加上锁
main thread stop
1
2
3
4
5
6
7
8
9
10
结果

 

锁都有那些呢?

  两种:Lock(指令锁、RLock(可重入锁)。Lock属于全局,Rlock属于线程。

 

学习lock和Rlock区别前,我们要搞清楚什么事死锁。

死锁是:比如一辆车被两把锁锁住,你单单拿到一把锁的钥匙,你是开不了这个车的,这就是死锁。当然,这里是抽象的锁概念跟现实还有很大区别。

import threading
import time

lock = threading.Lock()
gl_num = 0
def show(arg):
    lock.acquire()
    print('我只执行一次就被锁住了。',threading.current_thread().name)
    lock.acquire()
    time.sleep(1)
    print(threading.current_thread().name)
    lock.release()
    lock.release()


for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

print ('main thread stop')
死锁
我只执行一次就被锁住了。 Thread-1
main thread stop
结果

那么这死锁怎么解决?呵呵,用Rlock,这因为就是他们的区别了。

import threading
import time

lock = threading.RLock()
gl_num = 0
def show(arg):
    lock.acquire()
    print('我只执行一次就被锁住了。',threading.current_thread().name)
    lock.acquire()
    time.sleep(1)
    print(threading.current_thread().name)
    lock.release()
    lock.release()


for i in range(10):
    t = threading.Thread(target=show, args=(i,))
    t.start()

print ('main thread stop')
Rlock解决死锁,代码几乎不变
我只执行一次就被锁住了。 Thread-1
main thread stop
Thread-1
我只执行一次就被锁住了。 Thread-2
Thread-2
我只执行一次就被锁住了。 Thread-3
Thread-3
我只执行一次就被锁住了。 Thread-4
Thread-4
我只执行一次就被锁住了。 Thread-5
Thread-5
我只执行一次就被锁住了。 Thread-6
Thread-6
我只执行一次就被锁住了。 Thread-7
Thread-7
我只执行一次就被锁住了。 Thread-8
Thread-8
我只执行一次就被锁住了。 Thread-9
Thread-9
我只执行一次就被锁住了。 Thread-10
Thread-10
结果

 总结

1、线程如果共用同一个数据(栈、队列),如果相互之间存在数据污染,那么就需要锁的来将操作公共数据的代码块锁起来。

2、锁的获取:lock = threading.Lock()或者lock = threading.RLock(),

3、lock跟RLock的区别,使用多把锁,那就需要Rlock来解决死锁问题。这里说的多把锁,是指一个锁多个嵌套。

 

转载于:https://www.cnblogs.com/hardykay/p/10203275.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Python电脑屏幕,你可以根据以下几种方法进行操作: 方法一:使用pywin32模块 首先需要安装pywin32模块,这是一个Python模块,可以让Python脚本访问Windows API。然后,使用以下代码来解电脑屏幕: ```python import win32con import win32gui win32gui.LockWorkStation() win32con.EWX_LOGOF | win32con.EWX_FORCE ``` 方法二:使用pyautogui模块 你可以使用`pyautogui`模块来模拟按下和释放键盘按键,以实现定时自动屏和解电脑屏幕的操作。以下是一个封装的示例代码: ```python import pyautogui import time def lock_screen(): pyautogui.keyDown('win') pyautogui.keyDown('l') time.sleep(0.1) pyautogui.keyUp('l') pyautogui.keyUp('win') def unlock_screen(): pyautogui.keyDown('enter') # 输入密码(根据需要修改) time.sleep(0.1) pyautogui.keyUp('enter') def auto_lock_screen(interval): while True: lock_screen() time.sleep(interval) # 屏后等待一定时间再解 unlock_screen() time.sleep(interval) # 解后等待一定时间再屏 interval_seconds = 3600 # 设置定时屏和解的时间间隔(单位:秒) auto_lock_screen(interval_seconds) ``` 方法三:使用win32api模块 你可以使用win32api模块来实现自动解电脑屏幕的功能,以下是示例代码: ```python import win32api import win32con def unlock_screen(): win32api.keybd_event(win32con.VK_LWIN, 0) win32api.keybd_event(win32con.VK_L, 0) win32api.keybd_event(win32con.VK_L, 0, win32con.KEYEVENTF_KEYUP, 0) win32api.keybd_event(win32con.VK_LWIN, 0, win32con.KEYEVENTF_KEYUP, 0) unlock_screen() ``` 这些方法提供了不同的方式来使用Python电脑屏幕,你可以根据自己的需求选择其中之一来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [如何使用python脚本自动解电脑屏幕](https://blog.csdn.net/weixin_45471729/article/details/129447108)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值