Python:将RLock与多线程一起使用

Python:将RLock与多线程一起使用,python,Python,预期的输出应该是所有3个func()进程完成,并且“finished”不打印,但是test()在func()中的第一次打印(i)后返回finished rlock=threading.rlock() def func(): rlock.acquire() 对于范围(3)中的i: 时间。睡眠(2) 印刷品(一) rlock.release() 返回 def test(): l=[] 对于范围(3)中的i: 时间。睡眠(1) threading.Thread(target=func.start())

预期的输出应该是所有3个func()进程完成,并且“finished”不打印,但是test()在func()中的第一次打印(i)后返回
finished

rlock=threading.rlock()
def func():
rlock.acquire()
对于范围(3)中的i:
时间。睡眠(2)
印刷品(一)
rlock.release()
返回
def test():
l=[]
对于范围(3)中的i:
时间。睡眠(1)
threading.Thread(target=func.start())
打印(锁定)#打印
打印(rlock._为_所有())#打印错误
如果不是rlock._是_所有的():
返回“已完成”#返回“已完成”
测试()

更新:我特别希望有一个
test()
函数,它在
rlock
中的所有线程完成之前不会返回。但是我很难确定rlock计数器是否递增——似乎没有相应的方法

当使用定义不清的内部函数(如_is_owned)时,最好查看源代码:

def _is_owned(self):
    # Return True if lock is owned by current_thread.
    # This method is called only if __lock doesn't have _is_owned().
主线程不拥有锁,因此函数返回false

更新

如果只想等待线程完成,则根本不需要RLock对象。只需使用join()方法:


谁在调用
test()
?它似乎在主线程上运行。。。因此它将首先执行,因为其他线程每次更新都必须等待2秒——没有竞态条件,您无法做到这一点。这个例子很奇怪,因为你创建了线程,但是由于锁的原因,你强迫它们串行运行,而不需要线程。如果您想让它们并行运行,请签出多处理线程池对象或创建一个队列来保存线程结果。我明白了,在这种情况下,我真的不知道如何执行我试图执行的操作,但让我更新我的问题。
def _is_owned(self):
    # Return True if lock is owned by current_thread.
    # This method is called only if __lock doesn't have _is_owned().
def func(): 
    for i in range(3): 
        time.sleep(2)
        print(i)
    return

def test(): 
    threads = []
    for i in range(3): 
        time.sleep(1)
        thread = threading.Thread(target=func)
        thread.start()
        threads.append(thread)
    for thread in threads:
        thread.join()
    return 'finished'

test()