We need to pickle any sort of callable

后端 未结 1 1333
遥遥无期
遥遥无期 2020-12-03 12:07

Recently a question was posed regarding some Python code attempting to facilitate distributed computing through the use of pickled processes. Apparently, that functionality

相关标签:
1条回答
  • 2020-12-03 12:23

    You could marshal the bytecode and pickle the other function things:

    import marshal
    import pickle
    
    marshaled_bytecode = marshal.dumps(your_function.func_code)
    # In this process, other function things are lost, so they have to be sent separated.
    pickled_name = pickle.dumps(your_function.func_name)
    pickled_arguments = pickle.dumps(your_function.func_defaults)
    pickled_closure = pickle.dumps(your_function.func_closure)
    # Send the marshaled bytecode and the other function things through a socket (they are byte strings).
    send_through_a_socket((marshaled_bytecode, pickled_name, pickled_arguments, pickled_closure))
    

    In another python program:

    import marshal
    import pickle
    import types
    
    # Receive the marshaled bytecode and the other function things.
    marshaled_bytecode, pickled_name, pickled_arguments, pickled_closure = receive_from_a_socket()
    your_function = types.FunctionType(marshal.loads(marshaled_bytecode), globals(), pickle.loads(pickled_name), pickle.loads(pickled_arguments), pickle.loads(pickled_closure))
    

    And any references to globals inside the function would have to be recreated in the script that receives the function.

    In Python 3, the function attributes used are __code__, __name__, __defaults__ and __closure__.

    Please do note that send_through_a_socket and receive_from_a_socket do not actually exist, and you should replace them by actual code that transmits data through sockets.

    0 讨论(0)
提交回复
热议问题