gpt4 book ai didi

Python线程: Threads runs twice?

转载 作者:太空宇宙 更新时间:2023-11-03 20:37:22 27 4
gpt4 key购买 nike

我对Python完全陌生,当我遇到这个问题时,我正在尝试线程模块:-线程由于某种原因运行两次,我不知道为什么。我到处寻找,但没有找到任何答案。希望我能在这里得到一些帮助

import time
from threading import Thread
import requests as requests
import threading as threading


threads = []
i = 0
time.sleep(0.5)
def whatever():
global i
while i < 10:
get = requests.get("http://www.exemple.com")
print(i)
i += 1

for t in range(5):
t = threading.Thread(target=whatever)
threads.append(t)
t.start()

我想要什么:

0
1
2
3
4
5
6
7
8
9
10
11
12
13

输出:

0
1
1
3
4
5
6
7
7
9
10
11
12
13

最佳答案

从多个线程修改全局变量本质上是不安全的。您需要锁定访问以防止竞争条件,例如线程 A 读取 i,然后线程 B 运行并递增 i 并将其存储回来,然后线程 A 返回并存储回其递增的 i 副本,因此它不会递增两次,而是仅递增一次。

解决方法是要么锁定访问,要么想出一种本质上线程安全的方法来完成您想要的操作。在 CPython 引用解释器上,保证不会 GIL在字节码之间释放,因此有一些技巧可以在没有锁的情况下执行此操作:

import time
from threading import Thread

threads = []
igen = iter(range(10))
time.sleep(0.5)
def whatever():
for i in igen:
get = requests.get("http://www.exemple.com")
print(i)

for t in range(5):
t = threading.Thread(target=whatever)
threads.append(t)
t.start()

使用锁更复杂,但应该可以移植到任何具有可预测行为的Python解释器(实际上,它毕竟仍然是线程):

import time
from threading import Thread, Lock

threads = []
i = 0
ilock = Lock()
time.sleep(0.5)
def whatever():
global i
while True:
with ilock:
if i >= 10:
break
icopy = i
i += 1
get = requests.get("http://www.exemple.com")
print(icopy)

for t in range(5):
t = threading.Thread(target=whatever)
threads.append(t)
t.start()

这不会按数字顺序打印出来,但它将并行运行请求,并且只会打印一次 i 的任何给定值。

关于Python线程: Threads runs twice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57085878/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com