首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在执行run()之后在线程中自动释放信号量?

如何在执行run()之后在线程中自动释放信号量?
EN

Stack Overflow用户
提问于 2013-08-30 09:22:07
回答 1查看 977关注 0票数 0

我正在通过信号量跟踪线程的数量:

代码语言:javascript
复制
#!/usr/bin/python3
import threading

class MyThread(threading.Thread):

    max_threads           = 5
    max_threads_semaphore = threading.BoundedSemaphore(value=max_threads)
    semaphore_timeout     = 60 

    def __init__(self, target=None, name=None, args=(), kwargs={}):
        super().__init__(target=target, name=name, args=args, kwargs=kwargs)

    def start(self):
        semaphore_aquired = self.max_threads_semaphore.acquire(blocking=True, timeout=self.semaphore_timeout)
        if semaphore_aquired:
            print("Sempahore acquired by:", self.name)
            super().start()
        else:
            raise OSError("Time out aquiring max threads semaphore to start new thread")

    def join(self):
        super().join()
        semaphore_released = self.max_threads_semaphore.release()

但不是我想要的方式。我希望能够:

代码语言:javascript
复制
def print_test(num):
    print("executing:", num)
    sleep(10)
    print("end of execution:", num)

threads_dict = dict()
thread_range = range(1,20)
for i in thread_range:
    threads_dict[i] = MyThread(target=print_test(i))
    threads_dict[i].start()
for i in thread_range:
    threads_dict[i].join()
    print("joined:", threads_dict[i].name)

显然,一旦启动了5个线程(max_threads),脚本就处于死锁状态,直到达到信号量超时。

我认为start()方法会在一个新线程中启动run()方法。来自手册

每个线程对象最多只能调用一次start()。它安排在单独的控制线程中调用对象的run()方法。

因此,在MyThread中,我将join()部件替换为:

代码语言:javascript
复制
def run(self):
    super().run()
    semaphore_released = self.max_threads_semaphore.release()
    print("Sempahore released by:", self.name)

但是这段代码不是在一个新线程中执行的。产出如下:

代码语言:javascript
复制
executing: 1
end of execution: 1
Sempahore acquired by: Thread-1
Sempahore released by: Thread-1
executing: 2
end of execution: 2
Sempahore acquired by: Thread-2
Sempahore released by: Thread-2
executing: 3
end of execution: 3
Sempahore acquired by: Thread-3
Sempahore released by: Thread-3
executing: 4
end of execution: 4
Sempahore acquired by: Thread-4
Sempahore released by: Thread-4
executing: 5
end of execution: 5
Sempahore acquired by: Thread-5
Sempahore released by: Thread-5
executing: 6
end of execution: 6
Sempahore acquired by: Thread-6
executing: 7
Sempahore released by: Thread-6
end of execution: 7
Sempahore acquired by: Thread-7
executing: 8
Sempahore released by: Thread-7
end of execution: 8
Sempahore acquired by: Thread-8
executing: 9
Sempahore released by: Thread-8
end of execution: 9
Sempahore acquired by: Thread-9
joined: Thread-1
joined: Thread-2
joined: Thread-3
joined: Thread-4
joined: Thread-5
joined: Thread-6
joined: Thread-7
joined: Thread-8
Sempahore released by: Thread-9
joined: Thread-9

是否有一种方法来重载threading.Thread函数,以便在目标函数结束时自动释放信号量?

我不明白为什么输出不是:

代码语言:javascript
复制
Sempahore acquired by: Thread-1
executing: 1
Sempahore acquired by: Thread-2
executing: 2
Sempahore acquired by: Thread-3
executing: 3
Sempahore acquired by: Thread-4
executing: 4
Sempahore acquired by: Thread-5
executing: 5
(sleep 10 secondes)
end of execution: 1
Sempahore released by: Thread-1
Sempahore acquired by: Thread-6
executing: 6
etc..
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-30 10:57:24

至于“奇怪”输出的问题。这是意料之中的,因为在创建新线程之前,在主线程中调用print_test(i)

代码语言:javascript
复制
threads_dict[i] = MyThread(target=print_test(i))

这是print_test(i)函数的执行。因此,您可以通过目标执行print_test(i)函数。

试着纠正这一点:

代码语言:javascript
复制
threads_dict[i] = MyThread(target=print_test, args=[i,])

经过这一修正后,我的输出如下:

代码语言:javascript
复制
('Sempahore acquired by:', 'Thread-1')
('Sempahore acquired by:', 'Thread-2')
('executing:', 1)
('Sempahore acquired by:', 'Thread-3')
('executing:', 2)
('Sempahore acquired by:', 'Thread-4')
('executing:', 3)
('Sempahore acquired by:', 'Thread-5')
('executing:', 4)
('executing:', 5)
('end of execution:', 1)
('Sempahore released by:', 'Thread-1')
('Sempahore acquired by:', 'Thread-6')
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18529331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档