5

私はこのような状況を持っています:

メインプロセスは、結果を文字列型と数値型の共有オブジェクトに書き込むサブプロセスを生成します。数値型には問題はありませんが、文字列では値が失われます。

import multiprocessing as mp
from ctypes import Structure, c_double, c_wchar_p, c_int

# shared obj class
class SharedObj(Structure):
    _fields_ = [('name', c_wchar_p), ('val', c_double) ]

def run_mp( values , lock , s ) :
    for i in range( s , len( values ) , 2 ):
        lock.acquire()
        values[i].name = str( i ) # write the string value in the shared obj
        values[i].val = float( i )
        print( "tmp: %d" % i )
        lock.release()

def main():
    # creating the shared obj and mutex
    values = mp.Array(  SharedObj , [SharedObj() for i in range( 10 )] )
    lock_j = mp.Lock()

    # creating two sub-process form the function run_mp
    p1 = mp.Process( target=run_mp , args=( values , lock_j , 0 ))
    p2 = mp.Process( target=run_mp , args=( values , lock_j , 1 ))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    for v in  values:
        print()
        print( "res name: %s" % v.name )
        print( "res val: %f " % v.val )


if __name__ == '__main__':
    main()

その結果、c_double を含む共有オブジェクトのフィールドがフィールドに書き込まれますが、サブプロセス rum-mp( string values[i].name = str( i )) で生成された文字列はメイン プロセスで失われます。

サブプロセスで生成された文字列を保存する方法はありますか?

このコードの出力は次のようになります

メインプロセスで結果として得られる文字列は完全にランダムです。

tmp: 0
tmp: 2
tmp: 3
tmp: 4

res name: ����羍����羍
res val: 0.000000
res name: ����羍����羍
res val: 1.000000
res name:
res val: 2.000000   ....
4

2 に答える 2

3

コードを少し変更したバージョンを次に示します。

#!/usr/bin/env パイソン

マルチプロセッシングを mp としてインポート


def run_mp( 値 ):
    値の c_arr、c_double の場合:
        c_arr.value = 'こんにちは foo'
        c_double.value = 3.14

デフメイン():
    ロック = mp.Lock()
    child_feed = []
    範囲内の i の場合 (10):
        child_feed.append(((
            mp.Array('c', 15, ロック = ロック),
            mp.Value('d', 1.0/3.0, ロック = ロック)
        )))

    p1 = mp.Process( target=run_mp , args=(child_feed,))
    p2 = mp.Process( target=run_mp , args=(child_feed,))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    child_feed の c_arr、c_double の場合:
        印刷()
        print( "res name: %s" % c_arr.value )
        print( "res val: %f" % c_double.value )


__name__ == '__main__' の場合:
    主要()

http://docs.python.org/library/multiprocessing.htmlを見てください。文字の配列を使用する例があります。

メモリを共有できるようにする mmap モジュールもありますhttp://docs.python.org/library/mmap.htmlが、これを使用すると、おそらくセマフォによってアクセスを自分で同期する必要があります。より単純なアプローチが好きな場合は、パイプを使用してください。

于 2012-09-09T21:23:41.057 に答える
1

multiprocessing.Array事前にサイズを指定する必要があるという明らかな要件があるため、使用しませんでした。以下は、マルチプロセッシング互換unicodeオブジェクトを使用する代わりに機能します。複数のプロセスを使用して Python 2.6 でテストされています。

>>> shared_str = multiprocessing.Manager().Value(unicode, 'some initial value')
>>> shared_str.value
'some initial value'
>>> shared_str.value = 'some new value'
>>> shared_str.value
'some new value'

文字列と数値の共有に関する作成者の特定の質問に対処するために、これらを格納するシリアル化可能なオブジェクトを作成して、Value代わりに渡すことができます。

Managerもちろん、この目的で使用する必要があることに反対することもできます。その場合は、代替ソリューションを提供してください。

于 2012-11-08T17:23:44.133 に答える