gpt4 book ai didi

python - 试图了解python多线程

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:09 25 4
gpt4 key购买 nike

请考虑这段代码:

import threading

def printer():
for i in range(2):
with lock:
print ['foo', 'bar', 'baz']

def main():
global lock
lock = threading.Lock()
threads = [threading.Thread(target=printer) for x in xrange(2)]
for t in threads:
t.start()
t.join()

main()

我能理解这段代码,而且很清楚:我们创建了两个线程并按顺序运行它们——只有当第一个线程完成时我们才运行第二个线程。好的,现在考虑另一种变体:

import threading

def printer():
for i in range(2):
with lock:
print ['foo', 'bar', 'baz']

def main():
global lock
lock = threading.Lock()
threads = [threading.Thread(target=printer) for x in xrange(2)]
for t in threads:
t.start()
for t in threads:
t.join()

main()

这里发生了什么?好的,我们并行运行它们,但是在第二个变体中让主线程等待子线程的目的是什么?它如何影响输出?

最佳答案

在第二个变体中,执行顺序的定义要少得多。每次通过打印机中的循环释放锁。在这两种变体中,您都有两个线程和一个线程中的两个循环。在第一个变体中,由于一次只有一个线程运行,所以您知道总顺序。在第二种变体中,每次释放锁时,运行的线程可能会发生变化。所以你可能会得到

  • 线程 1 循环 1
  • 线程 1 循环 2
  • 线程 2 循环 1
  • 线程 2 循环 2

或者也许*线程2循环1*线程1循环1*线程1循环2* 线程 2 循环 2

唯一的限制是给定线程中的循环 1 在该线程中的循环 2 之前运行,并且两个打印语句在一起,因为它们都持有锁。

在这种特殊情况下,我不确定在第二个变体中调用 t.join() 是否有明显的效果。它保证主线程将是最后一个结束的线程,但我不确定在这段代码中你能以任何方式观察到这一点。在更复杂的代码中,加入线程可能很重要,以便仅在所有线程终止后执行清理操作。如果您有守护线程,这也可能非常重要,因为当所有非守护线程终止时,整个程序将终止。

关于python - 试图了解python多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46430068/

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