2013-04-21 29 views
2

我什么时候可以使用dummy_threadingdummy_threading是做什么的?

我曾经以为在系统级线程不可用于Python的情况下,它可能会用模拟线程替换系统级线程。

但是当我运行此:

import dummy_threading as threading 

semaphore = threading.Semaphore() 
def f(i): 
    semaphore.acquire() 
    print i 
for i in xrange(10): 
    threading.Thread(target=f, args=(i,)).start() 
for _ in xrange(10): 
    semaphore.release() 

我得到0,并且程序不会终止。不仅如此,Python还是不知不觉地继续咀嚼我的电脑内存,直到它没有任何东西离开。

当我运行此:

import threading 

semaphore = threading.Semaphore() 
def f(i): 
    semaphore.acquire() 
    print i 
for i in xrange(10): 
    threading.Thread(target=f, args=(i,)).start() 
for _ in xrange(10): 
    semaphore.release() 

我得到0 1 3 5 7 9 2 4 6 8预期。我需要误解dummy_threading。我什么时候可以使用它?

仅供参考,我在Windows 7和Fedora 18上进行了比较,并得到了相同的结果。

编辑:但是,以下给出0 1 2 3 4 5 6 7 8 9

import dummy_threading as threading 

event = threading.Event() 
def f(i): 
    event.wait() 
    print i 
for i in xrange(10): 
    threading.Thread(target=f, args=(i,)).start() 
event.set() 

的一大问题是:什么dummy_threading,或者当将它给予相同的行为threading

回答

3

该模块旨在用于threadthreading在您的平台上不可用。

您传递给它的函数被同步调用,您立即调用.start()。第一个函数获取semphore,打印,然后第二个函数被调用并阻塞。它同步运行并且永不返回。

dummy_thread documentation

要小心,不要使用这个模块,其中僵局可能会从一个线程被创建,以创建等待另一个线程块的发生。这通常会在阻止I/O时发生。

,并从EFF-bot post(否则短,缺少一个工作环节):

助手,使其更容易编写使用如果支持线程的代码,但仍对Python的版本上运行的不支持线程。虚拟模块只是按顺序运行线程。

注意使它更容易部分;如果没有实际的线程,您不能期望代码在dummy_threading下运行时不会像您的示例中那样执行死锁。

+0

'dummy_threading'是否打算给出类似的结果?因为似乎没有工作,根据我的例子。 – 2013-04-21 17:42:59

+0

@PaulDraper:它的目的是使API看起来相同,而不实际执行线程。 – 2013-04-21 17:54:52

2

dummy_threading中,线程只是函数包装器,它们是按顺序执行的。

第二个代码段的问题是dummy_threading.Thread.start()不会返回,直到相应的f调用退出。线程0将获取信号量,然后线程1将尝试获取它并阻止。而且什么都不会释放信号量,因为只有一个被阻塞的线程。

更新:做了一些关于虚拟事件行为的研究。

事实上,所有的SemaphoreEventCondition等在dummy_threading是完全一样的正常threading不同之处在于他们使用假锁(有此做了一些进口的魔法。)因此,当你打电话event.wait(),底层的锁永远不会阻塞线程。无论块锁由Semaphore使用,但在内部信号的循环,直到资源可用:

while self.__value == 0: # Here it will loop forever 
    if not blocking: 
     break 
    .... 
    self.__cond.wait() 

我认为,虚拟事件违反了假设,每当wait不带参数调用返回时,它意味着事件设置,但不知道这是否可以轻松帮助。

+0

如果我用'Event'替换'Semaphore',它可以工作,但我会想象出现这种情况会出于同样的原因,不是吗? – 2013-04-21 17:56:41

+0

@PaulDraper显然,虚拟'Event'中有一些特性,即使没有设置,wait也不会阻塞(在这种情况下,它返回符合API的False)。我认为,这对于信号量有所不同,因为它具有非阻塞“获取”的明确方式。 – bereal 2013-04-21 18:12:16

+0

'dummy_threading'中的特点是吗?因为'threading' API描述是:“阻塞直到内部标志为真,如果内部标志为真,则立即返回,否则阻塞直到另一个线程调用set()将标志设置为true,或者直到可选超时发生。“ – 2013-04-21 18:14:53