<div dir="ltr">Hi Florian,<div><br></div><div>sorry, this list is mostly deprecated, with all IPython discussions now happening on a single list:</div><div><br></div><div><a href="https://mail.scipy.org/mailman/listinfo/ipython-dev">https://mail.scipy.org/mailman/listinfo/ipython-dev</a><br></div><div><br></div><div>The issue is the closure over xs in your lambda; pickle doesn't know how to serialize closures.  You can make it work if you enable the cloudpickle serializer instead:</div><div><br></div><div><div>    dview.use_cloudpickle()</div></div><div><br></div><div>as indicated here: <a href="http://ipyparallel.readthedocs.io/en/latest/details.html#closures">http://ipyparallel.readthedocs.io/en/latest/details.html#closures</a></div><div><br></div><div>An interesting tidbit is that if you move the code in `main` out to the top-level of the script and manually push `xs` as well, the code works fine even without the cloudpickle change.  That's because names that require a lookup into globals() don't require the creation of a closure object, as explained in the link above.</div><div><br></div><div>Cheers,</div><div><br></div><div>f</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 16, 2017 at 2:07 AM, Florian Lindner <span dir="ltr"><<a href="mailto:mailinglists@xgm.de" target="_blank">mailinglists@xgm.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I have this small sample program:<br>
<br>
import ipyparallel as ipp, numpy as np<br>
<br>
class X:<br>
    def __init__(self, x, xs):<br>
        self.A = np.full((10, 10), x)<br>
        np.fill_diagonal(self.A, x*10)<br>
<br>
    def norm(self):<br>
        return np.linalg.norm(self.A)<br>
<br>
<br>
def main():<br>
    rc = ipp.Client()<br>
    lview = rc.load_balanced_view()<br>
    dview = rc[:]<br>
    dview.push({"X" : X})<br>
    dview.execute("import numpy as np")<br>
<br>
    xs = np.linspace(1, 100, 10)<br>
    sqxs = []<br>
<br>
    sqxs = lview.map(lambda x: X(x, xs), xs)<br>
    sqxs.wait()<br>
<br>
    for i in sqxs:<br>
        print(i.norm())<br>
<br>
if __name__ == "__main__":<br>
    main()<br>
<br>
<br>
trying it to run gives TypeError: can't pickle memoryview objects. Probably because I provide the xs array to X.<br>
<br>
How can I work around this situation?<br>
<br>
Thanks,<br>
Florian<br>
<br>
Complete traceback:<br>
<br>
Traceback (most recent call last):<br>
  File "ipython_parallel.py", line 30, in <module><br>
    main()<br>
  File "ipython_parallel.py", line 23, in main<br>
    sqxs = lview.map(lambda x: X(x, xs), xs)<br>
  File "<decorator-gen-136>", line 2, in map<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>view.py", line 50, in sync_results<br>
    ret = f(self, *args, **kwargs)<br>
  File "<decorator-gen-135>", line 2, in map<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>view.py", line 35, in save_ids<br>
    ret = f(self, *args, **kwargs)<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>view.py", line 1109, in map<br>
    return pf.map(*sequences)<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>remotefunction.py", line 285, in map<br>
    return self(*sequences, __ipp_mapping=True)<br>
  File "<decorator-gen-118>", line 2, in __call__<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>remotefunction.py", line 76, in sync_view_results<br>
    return f(self, *args, **kwargs)<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>remotefunction.py", line 259, in __call__<br>
    ar = view.apply(f, *args)<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>view.py", line 211, in apply<br>
    return self._really_apply(f, args, kwargs)<br>
  File "<decorator-gen-134>", line 2, in _really_apply<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>view.py", line 47, in sync_results<br>
    return f(self, *args, **kwargs)<br>
  File "<decorator-gen-133>", line 2, in _really_apply<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>view.py", line 35, in save_ids<br>
    ret = f(self, *args, **kwargs)<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>view.py", line 1037, in _really_apply<br>
    metadata=metadata)<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/client/<wbr>client.py", line 1395, in send_apply_request<br>
    item_threshold=self.session.<wbr>item_threshold,<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/<wbr>serialize/serialize.py", line 166, in pack_apply_message<br>
    serialize_object(arg, buffer_threshold, item_threshold) for arg in args))<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/<wbr>serialize/serialize.py", line 166, in <genexpr><br>
    serialize_object(arg, buffer_threshold, item_threshold) for arg in args))<br>
  File "/usr/lib/python3.6/site-<wbr>packages/ipyparallel/<wbr>serialize/serialize.py", line 112, in serialize_object<br>
    buffers.insert(0, pickle.dumps(cobj, PICKLE_PROTOCOL))<br>
TypeError: can't pickle memoryview objects<br>
<br>
______________________________<wbr>_________________<br>
IPython-User mailing list<br>
<a href="mailto:IPython-User@scipy.org">IPython-User@scipy.org</a><br>
<a href="https://mail.scipy.org/mailman/listinfo/ipython-user" rel="noreferrer" target="_blank">https://mail.scipy.org/<wbr>mailman/listinfo/ipython-user</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Fernando Perez (@fperez_org; <a href="http://fperez.org" target="_blank">http://fperez.org</a>)<br>fperez.net-at-gmail: mailing lists only (I ignore this when swamped!)<br>fernando.perez-at-berkeley: contact me here for any direct mail<br></div>
</div>