python - python中多线程时如何增加变量值
问题描述
我正在尝试使用多线程制作一个网络爬虫,以使其更快。我想让每次执行的价值都增加。但有时值会在自身上跳过或重复。
import threading
num = 0
def scan():
while True:
global num
num += 1
print(num)
open('logs.txt','a').write(str(f'{num}\n'))
for x in range(500):
threading.Thread(target=scan).start()
结果:
2
2
5
5
7
8
10
10
12
13
13
13
16
17
19
19
22
23
24
25
26
28
29
29
31
32
33
34
预期结果:
1
2
3
4
5
6
7
8
9
10
解决方案
因此,由于变量num
是共享资源,因此您需要对其进行锁定。这是按如下方式完成的:
num_lock = threading.Lock()
每次要更新共享变量时,都需要线程首先获取锁。一旦获得锁,只有该线程有权更新 num 的值,而当当前线程获得锁时,其他线程将无法这样做。
确保在执行此操作时使用wait
或try-finally
阻塞,以保证即使当前线程无法更新共享变量也会释放锁。
像这样的东西:
num_lock.acquire()
try:
num+=1
finally:
num_lock.release()
使用with
:
with num_lock:
num+=1
推荐阅读
- sql - 如何摆脱没有电子邮件的空行?
- javascript - Cheerio 有时会返回空字符串
- c# - NullReferenceException:对象引用未设置为对象的实例。通过 Unity 教程
- google-apps-script - 循环浏览多个谷歌表格的多个标签
- firebase - Firestore whereNotIn 查询
- html - 创建响应式 CSS 记分板,其数值紧邻条形左侧
- javascript - 从数据库显示多个区域到谷歌地图
- sql - 打印表 1 中的所有数据和表 2 中的匹配数据,但如果表 2 为空怎么办
- python - 所有时间序列数组都是向量吗?
- amazon-cloudformation - 我想将 API Gateway 查询字符串参数添加到 cloudformation 模板