@@ -858,11 +858,10 @@ def find_ipython():
858
858
assert view .apply_sync (find_ipython )
859
859
860
860
@skip_without ('cloudpickle' )
861
- @pytest .mark .xfail (reason = "cloudpickle doesn't seem to work right now" )
862
861
def test_use_cloudpickle (self ):
863
862
view = self .client [:]
864
863
view ['_a' ] = 'engine'
865
- sys .modules ['__main__' ]. _a = 'client'
864
+ __main__ = sys .modules ['__main__' ]
866
865
867
866
@interactive
868
867
def get_a ():
@@ -874,14 +873,52 @@ def get_a():
874
873
875
874
# enable cloudpickle
876
875
view .use_cloudpickle ()
877
- # cloudpickle respects engine values *if defined*
876
+
877
+ # cloudpickle prefers client values
878
+ __main__ ._a = 'client'
878
879
a_list = view .apply_sync (get_a )
879
- self .assertEqual (a_list , ['engine' ] * len (view ))
880
- # cloudpickle uses client values if engine doesn't override
880
+ self .assertEqual (a_list , ['client' ] * len (view ))
881
+
882
+ # still works even if remote is undefined
881
883
view .execute ('del _a' , block = True )
882
884
a_list = view .apply_sync (get_a )
883
885
self .assertEqual (a_list , ['client' ] * len (view ))
886
+
884
887
# restore pickle, shouldn't resolve
885
- view .execute ('del _a' , block = True )
886
888
view .use_pickle ()
887
889
self .assertRaisesRemote (NameError , view .apply_sync , get_a )
890
+
891
+ @skip_without ('cloudpickle' )
892
+ def test_cloudpickle_push_pull (self ):
893
+ view = self .client [:]
894
+ # enable cloudpickle
895
+ view .use_cloudpickle ()
896
+
897
+ # push/pull still work
898
+ view .push ({"key" : "pushed" }, block = True )
899
+ ar = view .pull ("key" )
900
+ assert ar .get (timeout = 10 ) == ["pushed" ] * len (view )
901
+
902
+ # restore pickle, should get the same value
903
+ view .use_pickle ()
904
+ ar = view .pull ("key" )
905
+ assert ar .get (timeout = 10 ) == ["pushed" ] * len (view )
906
+
907
+ @skip_without ('cloudpickle' )
908
+ @pytest .mark .xfail (reason = "@require doesn't work with cloudpickle" )
909
+ def test_cloudpickle_require (self ):
910
+ view = self .client [:]
911
+ # enable cloudpickle
912
+ view .use_cloudpickle ()
913
+ assert (
914
+ 'types' not in globals ()
915
+ ), "Test condition isn't met if types is already imported"
916
+
917
+ @ipp .require ("types" )
918
+ @ipp .interactive
919
+ def func (x ):
920
+ return types .SimpleNamespace (n = x ) # noqa: F821
921
+
922
+ res = view .apply_async (func , 5 )
923
+ assert res .get (timeout = 10 ) == []
924
+ view .use_pickle ()
0 commit comments