如何在Python的多个线程之间交替?



我正在尝试在两个线程之间交替:

import threading
def test1():
for _ in range(3):
print("Test1")

def test2():
for _ in range(3):
print("Test2")
t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
t2.start()
t1.join()
t2.join()

但是,结果如下:

Test1
Test1
Test1
Test2
Test2
Test2

我想要的结果如下所示:

Test1
Test2
Test1
Test2
Test1
Test2

有什么办法可以做到吗?

您可以使用一个全局变量获得替代结果锁,andwhilestatement如下所示:

import threading
owner = "Test1"
lock = threading.Lock()
def test1():
global owner
i = 0
while i < 3:
lock.acquire()
if owner == "Test1":
print("Test1")
owner = "Test2"
i += 1
lock.release()
def test2():
global owner
i = 0
while i < 3:
lock.acquire()
if owner == "Test2":
print("Test2")
owner = "Test1"
i += 1
lock.release()
t1 = threading.Thread(target=test1)
t2 = threading.Thread(target=test2)
t1.start()
t2.start()
t1.join()
t2.join()

然后,您可以得到下面的替代结果:

Test1
Test2
Test1
Test2
Test1
Test2

您还可以使用一个队列获得备用结果锁,andwhilestatement如下所示:

import queue
import threading
lock = threading.Lock()
def test1(owner):
i = 0
while i < 3:
lock.acquire()
if owner.queue[0] == "Test1":
print("Test1")
owner.queue[0] = "Test2"
i += 1
lock.release()
def test2(owner):
i = 0
while i < 3:
lock.acquire()
if owner.queue[0] == "Test2":
print("Test2")
owner.queue[0] = "Test1"
i += 1
lock.release()

owner = queue.Queue()
owner.put("Test1")
t1 = threading.Thread(target=test1, args=(owner,))
t2 = threading.Thread(target=test2, args=(owner,))
t1.start()
t2.start()
t1.join()
t2.join()

然后,您可以得到下面的替代结果:

Test1
Test2
Test1
Test2
Test1
Test2

我想你这里的问题是关于为什么这两个函数不是同时执行,而是按顺序执行。答案是Python具有全局解释器锁(GIL)。单个Python进程(通常)不会在多个并行线程中运行Python代码。也有例外,比如在运行本机代码时(在这种情况下GIL可能会被释放)。

在您的简单示例中,当然不需要线程。在现实世界的场景中,这个问题实际上不是什么问题。通常,CPU密集型任务被卸载到本机库(如Pytorch, Numpy, Scipy, Pandas等),所有这些都是用本机代码编写的,或者内置了并行化。

如果你发现自己编写的代码可以通过使用多个CPU内核来解释Python代码来解决,那么很可能有更好的解决方案。

也就是说,看看multiprocessing模块,它可以通过利用多个进程和并行原语(如队列和map-reduce)并行运行多个Python函数

相关内容

  • 没有找到相关文章

最新更新