私は3つのプロセスを起動しており、プロセスに対応するインデックスに文字列を共有配列に入れたいと考えています。以下のコードでPython:マルチプロセッシングとc_char_pの配列
ルックは、生成される出力は次のようになります。
['test 0', None, None]
['test 1', 'test 1', None]
['test 2', 'test 2', 'test 2']
'テスト0' test 2
によりtest 1
、およびtest 1
によって上書きされますなぜ?私が欲しいもの
は(順序は重要ではありません)です:
は['test 0', None, None]
['test 0', 'test 1', None]
['test 0', 'test 1', 'test 2']
コード:
#!/usr/bin/env python
import multiprocessing
from multiprocessing import Value, Lock, Process, Array
import ctypes
from ctypes import c_int, c_char_p
class Consumer(multiprocessing.Process):
def __init__(self, task_queue, result_queue, arr, lock):
multiprocessing.Process.__init__(self)
self.task_queue = task_queue
self.result_queue = result_queue
self.arr = arr
self.lock = lock
def run(self):
proc_name = self.name
while True:
next_task = self.task_queue.get()
if next_task is None:
self.task_queue.task_done()
break
answer = next_task(arr=self.arr, lock=self.lock)
self.task_queue.task_done()
self.result_queue.put(answer)
return
class Task(object):
def __init__(self, i):
self.i = i
def __call__(self, arr=None, lock=None):
with lock:
arr[self.i] = "test %d" % self.i
print arr[:]
def __str__(self):
return 'ARC'
def run(self):
print 'IN'
if __name__ == '__main__':
tasks = multiprocessing.JoinableQueue()
results = multiprocessing.Queue()
arr = Array(ctypes.c_char_p, 3)
lock = multiprocessing.Lock()
num_consumers = multiprocessing.cpu_count() * 2
consumers = [Consumer(tasks, results, arr, lock) for i in xrange(num_consumers)]
for w in consumers:
w.start()
for i in xrange(3):
tasks.put(Task(i))
for i in xrange(num_consumers):
tasks.put(None)
私は、Python 2.7.3(Ubuntuの)を実行しているが
10億回ありがとうございます!両方のソリューションが実際に動作しています:)私はJ.F. Sebastianの投稿に出会いましたが、何らかの理由でそれを実装できませんでした。今、私はあなたの像をどこに建てるべきか教えてください。もう一度ありがとう... – Ujoux
興味深い質問とあなたの熱意をありがとう!あなたがStackoverflowでもっと見ることを願っています。彫像について - 私はチェックマークの上にあるアップローをクリックするとかなり素晴らしいものになると思います^) – unutbu
私は15の必要な評判を持ってすぐに行います、私は忘れません;) – Ujoux