我正在尝试遵循此示例
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()
答案 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
是两位数字,则可能会遇到问题。