Python信号量似乎在Google Colab中不起作用

时间:2019-06-23 01:56:39

标签: python multithreading google-colaboratory

我正在尝试遵循此示例

limit number of threads working in parallel

要限制正在使用的线程数。

当我尝试此代码时

import threading
import time

maxthreads = 5
sema = threading.Semaphore(value=maxthreads)
threads = list()

def task(i):
    sema.acquire()
    print( "start %s" % (i,))
    time.sleep(2)
    sema.release()

for i in range(10):
    thread = threading.Thread(target=task,args=(str(i)))
    threads.append(thread)
    thread.start()

这是输出

start 0start 1
start 3start 2


start 4

输出的第二部分不出现。也许这与colab有关?

如果是这样,是否有建议的方法来限制colab多线程中的线程数?

我也尝试了boundedsemaphore,结果相同

import threading
import time

maxthreads = 5
sema = threading.BoundedSemaphore(maxthreads)
threads = list()

def task(i):
    sema.acquire()
    print( "start %s" % (i,))
    time.sleep(2)
    sema.release()

for i in range(10):
    thread = threading.Thread(target=task,args=(str(i)))
    threads.append(thread)
    thread.start()

1 个答案:

答案 0 :(得分:1)

您正在以正确的方式限制线程数量。问题似乎是,在某个进程闲置了一定时间后,Google Colab停止了该进程的执行。我找不到具体的文档来证实这一点,但我想这样做是为了防止滥用。在计算机上本地执行时,您的代码应产生正确的输出。请注意,如果仅在Google Colab上使用2个线程,会发生什么情况:

import threading
import time

maxthreads = 2
sema = threading.Semaphore(value=maxthreads)
threads = list()

def task(i):
    sema.acquire()
    print( "start %s" % (i,))
    time.sleep(2)
    sema.release()

for i in range(10):
    thread = threading.Thread(target=task,args=(str(i)))
    threads.append(thread)
    thread.start()

您将获得以下输出:

start 0
start 1

因为在进程休眠之前仅打印那些行。另外请注意,如果您不使用time.sleep(),则会得到正确的输出:

import threading
import time

maxthreads = 5
sema = threading.Semaphore(value=maxthreads)
threads = list()

def task(i):
    sema.acquire()
    print( "start %s" % (i,))
    sema.release()

for i in range(10):
    thread = threading.Thread(target=task,args=(str(i)))
    threads.append(thread)
    thread.start()

如果我使用time.sleep(.1)将进程睡眠很短的时间,我也会碰巧获得正确的结果。


在不相关的音符上,您可能应该更改

thread = threading.Thread(target=task,args=(str(i)))

收件人

thread = threading.Thread(target=task,args=[i])

如果i是两位数字,则可能会遇到问题。