「いまいましい初心者」だけでなく、このサイトの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]
ほら、私が何を意味するのですか?モジュールからはまだ機能しません。