[IPython-User] parallelism with arbitrary function handles
Robert Nishihara
robertnishihara@gmail....
Wed Jun 20 10:51:17 CDT 2012
Ah, this fixes everything. Thank you!
On Tue, Jun 19, 2012 at 11:06 PM, MinRK <benjaminrk@gmail.com> wrote:
> Also, your code works exactly as-is with this change<https://github.com/ipython/ipython/pull/1990> (the
> `view['f'] = f` step remains unnecessary).
>
> -MinRK
>
>
> On Tue, Jun 19, 2012 at 7:54 PM, MinRK <benjaminrk@gmail.com> wrote:
>
>> On Tue, Jun 19, 2012 at 7:14 PM, Robert Nishihara <
>> robertnishihara@gmail.com> wrote:
>>
>>> Hi,
>>>
>>> I have been running into a problem using map_sync in IPython.parallel
>>> (please tell me if this is the wrong place to ask this question). The
>>> script below works fine:
>>>
>>> from IPython import parallel
>>>
>>> def run_stuff():
>>> def func(x):
>>> return x
>>> rc = parallel.Client(profile='sge')
>>> dview = rc[:]
>>> dview['func'] = func
>>> print dview.map_sync(func, range(10))
>>>
>>> run_stuff()
>>>
>>> The issue occurs when I want "func" to be parametrized by some arbitrary
>>> function "f". The script below is the simple example that illustrates the
>>> failure I am seeing
>>>
>>> from IPython import parallel
>>>
>>> def run_stuff(f):
>>> rc = parallel.Client(profile='sge')
>>> dview = rc[:]
>>> dview['f'] = f
>>> def func(x,f=f):
>>> return f(x)
>>> print dview.map_sync(func, range(10))
>>>
>>> def g(x):
>>> return x
>>>
>>> run_stuff(g)
>>>
>>> This script fails with the error:
>>>
>>> AttributeError: 'module' object has no attribute 'g'.
>>>
>>> The name "g" is not accessible to the function "run_stuff". The two
>>> scripts are attached. Can anyone help?
>>>
>>
>> Here's a detailed explanation<http://stackoverflow.com/questions/10857250/python-name-space-issues-with-ipython-parallel> of
>> how namespaces are resolved.
>>
>> To breakdown your case:
>>
>> def func(x, f=f)
>>
>> creates a function with default value tied to the module locals (module
>> being __main__). g is not defined remotely, so __main__.g doesn't resolve.
>> We have some utilities that allow functions to be serialized in a way that
>> works around this, but func.func_defaults is inspected and wrapped like
>> func itself. If we added that, then this code would just work, I think.
>>
>> If you avoid passing arguments via the func_defaults, and pass them as
>> arguments explicitly, you avoid the problem:
>>
>> def func(x,f):
>> ...
>>
>> view.map_sync(func, range(10), [f]*10)
>>
>> Will avoid the issue.
>>
>> There is no need to push f before passing it to map.
>>
>> -MinRK
>>
>>
>>>
>>> -Robert
>>>
>>> _______________________________________________
>>> IPython-User mailing list
>>> IPython-User@scipy.org
>>> http://mail.scipy.org/mailman/listinfo/ipython-user
>>>
>>>
>>
>
> _______________________________________________
> IPython-User mailing list
> IPython-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/ipython-user
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/ipython-user/attachments/20120620/81e0aef5/attachment.html
More information about the IPython-User
mailing list