0

「いまいましい初心者」だけでなく、このサイトのpythonについても、ここにあるので、ご容赦ください。:)

複数のプロセスで関数を実行しようとしています。これは、 2 つの引数を取るサブ関数で動作する必要があります。1 つは map_sync によって範囲から渡され、もう 1 つはstaticである必要があるため、" push "によって直接渡すようにしています。

以下は、私が何を意味するかを説明するために、私の実際のセットアップの単純化された例です。これを iPython Notebook から実行すると、完全に実行されます。

In [26]:

from IPython.parallel import Client

def mul(b):
    return a*b

def mmul(a,b):
    lvClient = Client()
    v = lvClient[:]
    v.push(dict(a=a))
    return v.map_sync(mmul, range(b))

In [27]: mmul(2,5)

Out[27]: [0, 2, 4, 6, 8]

ここで、上記のコード全体を「mymultitest.py」という名前のモジュール (完全に変更しない) に入れようとすると、もう機能しません。

In [24]: import mymultitest

Out[24]: <module 'mymultitest' from 'mymultitest.pyc'>

In [25]: mt = mymultitest.mmul(2,5)

[0:apply]: 
-------------------------------------------------------------------------
NameError     Traceback (most recent call last)<string> in <module>()
E:\iPython\mymultitest.pyc in mmul(b)
      4 
      5 def mul(b):
----> 6     return a*b
      7 
      8 def mmul(a,b):
NameError: global name 'a' is not defined

私は何を間違っていますか - 解決策は何ですか?

#### 追加: ####

OK、最初の返信の意味を推測したので、カーネルをゼロから完全に開始し、セル #1 にコードを直接入力して、「a」が既に変数として定義されないようにしました。同じ結果、完全に機能します:

In [1]:
from IPython.parallel import Client

def mul(b):
    return a*b

def mmul(x,y):
    lvClient = Client()
    v = lvClient[:]
    v.push(dict(a=x))
    return v.map_sync(mul, range(y))

In [2]: mmul(2,10)

Out[2]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

ほら、私が何を意味するのですか?モジュールからはまだ機能しません。

4

0 に答える 0