我正在尝试创建一个工作和一个线程池。 池中的每个线程都尝试选择一个工作,直到工作为空。 然后所有线程都加入。 当我在空闲时运行程序时,似乎线程没有正确连接(有时它正确执行)。 有时甚至所有线程都不参与正确的选择工作。
编辑:但是当我在命令shell中运行它时,它运行正常。
以下是相关代码。
import threading
import time
threads = []
work = range(1000)
lock = threading.Lock()
def f():
global work
th = threading.currentThread()
name = str(th.getName())
while True:
lock.acquire()
try:
size = str(len(work))
## print "\n Inside "+ name +" "+ size + "\n"
if size!="0":
w = work.pop()
else:
break
finally:
lock.release()
print "\n"+ name +" "+ size + "\n"
start1 = time.time()
for i in range(10):
t = threading.Thread(target = f)
threads.append(t)
t.start()
for th in threads:
print "joining"
th.join()
end1 = time.time()
start2 = time.time()
work = range(1000)
for i in work:
print i
end2 = time.time()
print end1-start1, end2-start2
答案 0 :(得分:0)
你怎么知道每个线程都没有从池中获取工作?或者所有线程都没有加入。
我猜测的情况是,一些线程是快速跑步者并且在一些慢速跑步者有机会从游泳池中抽取任何工作之前耗尽游泳池并且看起来他们没有做任何事情谢谢对你友好的日程安排。我能够通过几百次迭代成功运行它,看起来所有线程每次都成功加入。通过使用python 2.7.8进行测试:
i=0
for th in threads:
th.join() #blocks until successful
i+=1
assert i == 10
进一步增加或减少线程数,池大小或迭代次数会产生相同的结果。除非有更多的代码,否则你已经删除了这段代码。就我所见,这段代码是正确的。
编辑:关于IDLE - 据我所知,IDLE在运行线程应用程序时遇到了很多问题。 This thread提到了它们,但我找不到任何具体的错误或引用为什么会出现这种情况。它很可能是IDLE中的竞争条件导致线程无法运行/看起来它们没有运行/等。
此外,我能够在我的系统上的IDLE中执行此代码(通过我的修改),传递断言并且打印时间没有问题。如果您的问题与您在IDLE控制台上看到的内容有关,请务必考虑IDLE的打印功能很可能不是线程安全的。您可能无法在每次执行时看到所有输出,因为IDLE正在刷新缓冲区而不是写入(或在打印之前将其写入)。