Python线程:第二个线程等待第一个线程完成

2024-04-29 21:45:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python线程非常陌生,仍然无法使其正常工作。我不明白为什么,但是线程的执行结果并不是并行的。在

您能不能建议一下,代码中有什么不正确的地方(为了更接近示例,我尽可能地简化了它,但它并不像预期的那样工作):

import threading, time

def func1():
    for j in range (0, 10):
        print(str(time.ctime(time.time())) + " 1")
        time.sleep(0.5)


def func2():
    for j in range (0, 10):
        print(str(time.ctime(time.time())) + " 2")
        time.sleep(0.5)

print(str(time.ctime(time.time())) + " script started")

t1 = threading.Thread(target = func1(), name = " 1")
t2 = threading.Thread(target = func2(), name = " 2")

t1.start()
t2.start()

t1.join()
t2.join()

print (str(time.ctime(time.time())) + " over")

在控制台输出中,我看到第二个线程只在第一个线程完成时才开始。我尝试过使线程成为daemonic,remove.join()行,但仍然没有成功。在


Tags: infortimedefrangesleep线程t1
2条回答

我想指出一个事实穿线。锁定“使用对象管理语句和上下文来定义同步,因为它们支持对象的上下文管理:

lock = threading.Lock() # After: import threading
with lock:
    # critical section of code
    ...access shared resources...

这里,上下文管理机制保证在执行块之前自动获取锁,并在块完成后释放,而不管异常结果如何。 因此,上面Vincent建议的解决方案似乎是在解决一个更复杂的问题,即锁定共享的公共资源,阻止任何其他试图访问该资源的线程(实际上,停止任何试图获取同一锁的线程)。注:A穿线。锁定有两种状态:locked和unlocked,它是在unlocked状态下创建的。在下面,例如,由于只有一个线程可以更新全局变量“count”:

^{pr2}$

我建议使用多处理的另一种解决方案,因为您的两个并行函数基本上是两个独立的进程,不需要访问任何共享资源。在

from multiprocessing import Process
import time

def func1():
    for j in range (0, 10):
        print(str(time.ctime(time.time())) + " 1")
        time.sleep(0.5)

def func2():
    for j in range (0, 10):
        print(str(time.ctime(time.time())) + " 2")
        time.sleep(0.5)

if __name__ == '__main__':
    print(str(time.ctime(time.time())) + " script started")
    p1 = Process(target=func1)
    p1.start()
    p2 = Process(target=func2)
    p2.start()
    p1.join()
    p2.join()
    print (str(time.ctime(time.time())) + " over")

您正在呼叫您的目标(target=func1())。相反,请执行以下操作:

t1 = threading.Thread(target=func1, name = "1")
t2 = threading.Thread(target=func2, name = "2")

编辑:这就是你锁定指纹的方法:

^{pr2}$

相关问题 更多 >