首页 > 解决方案 > 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

标签: python

解决方案


因此,由于变量num是共享资源,因此您需要对其进行锁定。这是按如下方式完成的:

num_lock = threading.Lock()

每次要更新共享变量时,都需要线程首先获取锁。一旦获得锁,只有该线程有权更新 num 的值,而当当前线程获得锁时,其他线程将无法这样做。

确保在执行此操作时使用waittry-finally阻塞,以保证即使当前线程无法更新共享变量也会释放锁。

像这样的东西:

num_lock.acquire()
try:
        num+=1
finally:
   num_lock.release()

使用with

 with num_lock:
   num+=1

推荐阅读