dispy示例程序挂起

时间:2016-06-14 16:09:02

标签: python-3.x dispy

TL; DR:我无法获得最基本的dispy示例代码以便正常运行。为什么不呢?

详细信息:

我试图在python中进行分布式处理,并认为dispy库听起来很有趣,因为它具有全面的功能集。

但是,我一直试图遵循他们的基本规范程序示例,而且我无处可去。

  • 我安装了dispy(python -m pip install dispy
  • 我继续使用具有相同子网地址的另一台计算机并运行python dispynode.py。它似乎工作,因为我得到以下输出:
      

    2016-06-14 10:33:38 dispynode - dispynode version 4.6.14
      2016-06-14 10:33:38 asyncoro - 版本4.1带epoll I / O通知器
      2016-06-14 10:33:38 dispynode - 在10.0.48.54:51348服务8 cpus

         

    输入"退出"或"退出"终止dispynode,"停止"停止   服务,"开始"重启服务," 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()。完成只是一个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 - 版本4.1带有epoll I / O通知器
  2016-06-14 10:27:01 dispy - dispy客户:51347   2016-06-14 10:27:01 dispy - 在&#34; _dispy_20160614102701&#34;中存储故障恢复信息;
  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 dispy - 待定职位:9
  2016-06-14 10:27:01 dispy - 待定职位:10

这看起来并不出人意料,但并没有帮助我找出工作没有运行的原因。

对于它的价值,这里的_dispy_20160614102701.bak:

  

&#39; _cluster&#39;,(0,207)
  &#39; compute_1465918021755&#39;,(512,85)

同样,_dispy_20160614102701.dir:

  

&#39; _cluster&#39;,(0,207)
  &#39; compute_1465918021755&#39;,(512,85)

我猜对了,除非我使用的是不稳定的版本。

4 个答案:

答案 0 :(得分:1)

首次在网络上设置和使用dispy时,我发现在创建作业集群时必须指定客户端节点IP,请参阅下文:

cluster = dispy.JobCluster(compute, ip_addr=your_ip_address_here)

看看是否有帮助。

答案 1 :(得分:0)

如果您只是在客户端上运行sample.py,请在主要声明中更改以下内容:

cluster = dispy.JobCluster(compute,nodes = [&#39; nodeip_1&#39;,&#39; nodeip_2&#39;,.....,&#39; nodeip_n])

然后在IDE中或通过shell运行它。

我希望有所帮助。

答案 2 :(得分:0)

在执行public class LoginTest { @Test public void Test01_LoginPage() { //Some Code here } @Test public void Test02_LoginPage() { //Some Code Here } @BeforeMethod public void beforeTestCase(Method m) { System.out.println(m.getName()); } @AfterMethod public void AfterTestCase(Method m) { System.out.println(m.getName()); } } 之前,python sample.py仍应在localhost或其他计算机上运行(如果您不想指定复杂选项,请注意其他计算机应位于同一网络中。)< / p>

我遇到了同样的问题并以这种方式解决了这个问题:

  • 打开一个终端并执行:dispynode.py(不要终止它)
  • 打开第二个终端并执行:$ dispynode.py

不要忘记函数 compute 在等待一段时间后,输出应该在执行sample.py后至少20秒出现。

答案 3 :(得分:0)

试试这个

python /home/$user_name/.local/lib/python3.9/site-packages/dispy/dispynode.py
python sample.py

它对我有用