python-3.x - threading.lock 强制线程顺序运行?
问题描述
我的虚拟脚本使用了两个函数,一个加 1,一个减 1。我试图用线程异步运行每个函数 1000000 次,并使用锁来防止竞争条件。
但是,我注意到当我的锁在for loop
自身内部使用时,同一个线程将运行直到循环完成,这让我相信线程是同步运行的。
这是我的脚本的外观:
master_count = 0
trials = 1000
import threading
def add_count():
global master_count
for i in range(trials):
with lock:
print(threading.current_thread().getName())
master_count += 1
def subtract_count():
global master_count
for i in range(trials):
with lock:
print(threading.current_thread().getName())
master_count -= 1
lock = threading.Lock()
t1 = threading.Thread(target = add_count, name = 'add1' )
t2 = threading.Thread(target = add_count, name = 'add2' )
t3 = threading.Thread(target = subtract_count, name = 'subtract1' )
t4 = threading.Thread(target = subtract_count, name = 'subtract2' )
t1.start()
t2.start()
t3.start()
t4.start()
t4.join()
t2.join()
t3.join()
t1.join()
print(master_count)
我看到这个输出到 python shell(10 次试验):
add1
add1
add1
add1
add1
add1
add1
add1
add1
add1
add2
add2
add2
add2
add2
add2
add2
add2
add2
add2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract2
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
subtract1
我想如果脚本正在异步运行,我会看到混合的线程名称,而不是这个有序的输出。
我也在一个While
循环中尝试过这个,但我遇到了同样的问题。
那么它实际上是同步运行的吗?如果是这样,我怎样才能让它与锁异步运行。
谢谢你。
解决方案
推荐阅读
- c++ - 在邻接列表上添加一个关系时如何解决此分段错误?
- python - 数据帧列表到 JSON 列表
- android - Xamarin:按下设备按钮时触发页面功能
- c - 唤醒一个正在休眠的 Kthread
- angular - 更改 FormGroup.value 编辑实际的 formGroup 控件
- python - 如何在 shell 命令中发送 Jenkins 内部版本号作为参数,该命令将在构建结束后执行
- ruby-on-rails - 为什么重定向在rails中不能完美运行,而我正在尝试添加一个方法,它总是在控制器中寻找主要方法
- python - 在抓取所有 div 以获取数据时,在 python 中使用 lxml 获取空列表
- gmail-api - Gmail 是否通过 API 在用户邮箱中提供阻止电子邮件、域支持?
- sendgrid - SendGrid 模板 - 修改数据