TL;DR:我无法让最基本的dispy
示例代码正常运行。为什么不?
细节:
我正在尝试在 python 中进行分布式处理,并且认为dispy库听起来很有趣,因为它具有全面的功能集。
但是,我一直在尝试遵循他们的基本规范程序示例,但我一无所获。
- 我已经安装了 dispy (
python -m pip install dispy
) - 我继续使用相同子网地址的另一台机器并运行
python dispynode.py
. 它似乎有效,因为我得到以下输出:2016-06-14 10:33:38 dispynode - dispynode 版本 4.6.14
2016-06-14 10:33:38 asyncoro - 带有 epoll I/O 通知器的 4.1 版
2016-06-14 10:33:38 dispynode - 服务8 cpu 在 10.0.48.54:51348输入“quit”或“exit”终止dispynode,“stop”停止
服务,“start”重新启动服务,“cpus”改变使用的CPU,
其他任何获取状态: - 回到我的客户端机器上,我运行从http://dispy.sourceforge.net/_downloads/sample.py下载的示例代码,复制到这里:
# function 'compute' is distributed and executed with arguments
# supplied with 'cluster.submit' below
def compute(n):
import time, socket
time.sleep(n)
host = socket.gethostname()
return (host, n)
if __name__ == '__main__':
# executed on client only; variables created below, including modules imported,
# are not available in job computations
import dispy, random
# distribute 'compute' to nodes; 'compute' does not have any dependencies (needed from client)
cluster = dispy.JobCluster(compute)
# run 'compute' with 20 random numbers on available CPUs
jobs = []
for i in range(20):
job = cluster.submit(random.randint(5,20))
job.id = i # associate an ID to identify jobs (if needed later)
jobs.append(job)
# cluster.wait() # waits until all jobs finish
for job in jobs:
host, n = job() # waits for job to finish and returns results
print('%s executed job %s at %s with %s' % (host, job.id, job.start_time, n))
# other fields of 'job' that may be useful:
# job.stdout, job.stderr, job.exception, job.ip_addr, job.end_time
cluster.print_status() # shows which nodes executed how many jobs etc.
当我运行这个(python sample.py
)时,它只是挂起。通过 pdb 调试,我看到它最终挂在dispy/__init__.py(117)__call__()
. 该行显示self.finish.wait()
。finish 只是一个 python 线程,wait()
然后进入lib/python3.5/threading.py(531)wait()
. 一旦到达等待,它就会挂起。
我试过在客户端机器上运行 dispynode 并得到相同的结果。我已经尝试了很多将节点传递到集群创建中的变体,例如:
cluster = dispy.JobCluster(compute, nodes=['localhost'])
cluster = dispy.JobCluster(compute, nodes=['*'])
cluster = dispy.JobCluster(compute, nodes=[<hostname of the remote node running the client>])
我尝试在未cluster.wait()
注释的情况下运行,并得到相同的结果。
当我添加日志记录 ( cluster = dispy.JobCluster(compute, loglevel = 10)
) 时,我在客户端得到以下输出:
2016-06-14 10:27:01 asyncoro - 带有 epoll I/O 通知程序的 4.1 版
2016-06-14 10:27:01 dispy - dispy client at :51347 2016-06-14 10:27:01 dispy - 存储“_dispy_20160614102701”中的故障恢复信息
2016-06-14 10:27:01 dispy - 待处理的作业:0
2016-06-14 10:27:01 dispy - 待处理的作业:1
2016-06-14 10:27:01 dispy - 待定工作:2
2016-06-14 10:27:01 dispy - 待定工作:3
2016-06-14 10:27:01 dispy - 待定工作:4
2016-06-14 10:27:01 dispy - 待定工作:5
2016-06-14 10:27:01 dispy - 待定工作:6
2016-06-14 10:27:01 dispy - 待定工作:7
2016-06-14 10:27:01 dispy - 待定工作: 8
2016-06-14 10:27:01 显示 - 待定工作:9
2016-06-14 10:27:01 dispy - 待定工作:10
这似乎并不意外,但并不能帮助我弄清楚为什么作业没有运行。
对于它的价值,这里是_dispy_20160614102701.bak:
'_cluster', (0, 207)
'compute_1465918021755', (512, 85)
同样,_dispy_20160614102701.dir:
'_cluster', (0, 207)
'compute_1465918021755', (512, 85)
我没有猜测,除非我使用的是不稳定的版本。