How to share a string amongst multiple processes using Managers() in Python?

后端 未结 2 1379
心在旅途
心在旅途 2020-12-29 07:10

I need to read strings written by multiprocessing.Process instances from the main process. I already use Managers and queues to pass arguments to processes, so using the Man

相关标签:
2条回答
  • 2020-12-29 07:38

    Simply put the string in a dict:

    d = manager.dict()
    d['state'] = 'xyz'
    

    As strings themselves are immutable, sharing one directly would not be as useful.

    0 讨论(0)
  • 2020-12-29 07:48

    multiprocessing's Managers can hold Values which in turn can hold instances of the type c_char_p from the ctypes module:

    >>> import multiprocessing
    >>> import ctypes
    >>> v = multiprocessing.Value('c', "Hello, World!")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.7/multiprocessing/__init__.py", line 253, in Value
        return Value(typecode_or_type, *args, **kwds)
      File "/usr/lib/python2.7/multiprocessing/sharedctypes.py", line 99, in Value
        obj = RawValue(typecode_or_type, *args)
      File "/usr/lib/python2.7/multiprocessing/sharedctypes.py", line 73, in RawValue
        obj.__init__(*args)
    TypeError: one character string expected
    >>> cstring = multiprocessing.Value(ctypes.c_char_p, "Hello, World!")
    >>> cstring
    <Synchronized wrapper for c_char_p(166841564)>
    >>> cstring.value
    'Hello, World!'
    

    For Python 3, use c_wchar_p instead of c_char_p

    See also: Post with the original solution that I had a hard time finding.

    So a Manager can be used to share a string beneath multiple processes in Python like this:

    >>> from multiprocessing import Process, Manager, Value
    >>> from ctypes import c_char_p
    >>> 
    >>> def greet(string):
    >>>     string.value = string.value + ", World!"
    >>> 
    >>> if __name__ == '__main__':
    >>>     manager = Manager()
    >>>     string = manager.Value(c_char_p, "Hello")
    >>>     process = Process(target=greet, args=(string,))
    >>>     process.start()
    >>>     process.join()    
    >>>     print string.value
    'Hello, World!'
    
    0 讨论(0)
提交回复
热议问题