我以前从未使用过多线程,因此我搜索了一个简单的示例,并从8年前找到了这种方法,该方法打开了10个线程并以后加入:
(我喜欢它,因为我还需要保存线程功能的结果(
如何从python中的线程获取返回值?
def foo(bar, result, index):
print 'hello {0}'.format(bar)
result[index] = "foo"
from threading import Thread
threads = [None] * 10
results = [None] * 10
for i in range(len(threads)):
threads[i] = Thread(target=foo, args=('world!', results, i))
threads[i].start()
# do some other stuff
for i in range(len(threads)):
threads[i].join()
print " ".join(results)
我设法将其实施到我的代码中(我知道在没有多线程的情况下可以正常工作(,并且实现有效:没有错误,似乎一切都完成了,并且可以做到它应该做的。
之后,Ipython几乎不再响应(超级慢(,因此我无法继续工作。(我几乎无法键入和我在ipython中输入的新代码运行超级慢(
有什么想法可能导致问题?
根据ResourceManager,CPU仍在处理某些内容。但为什么?脚本已经完成!至少我99%的人肯定会这样做。我真的很感谢任何提示!
他们在"#做其他事情"中是什么?您可以添加到端iS_alive((以检查是线程还是其他引起此滞后的东西。
最小编辑的代码(W.R.T. YORS(如下。
def foo(bar, result, index):
print 'hello {0}'.format(bar)
result[index] = "foo"
from threading import Thread
threads = [None] * 10
results = [None] * 10
for i in range(len(threads)):
threads[i] = Thread(target=foo, args=('world!', results, i))
threads[i].start()
# do some other stuff
for i in range(len(threads)):
threads[i].join()
print " ".join(results)
for i in range(len(threads)):
print(threads[i].is_alive())
如果末端打印了10次false,那么您的线程都没有活着!他们已经完成了自己的工作,并且妨碍了他们,否则他们仍在工作。