ich starten 3 Prozesse und ich möchte, dass sie einen String in einem gemeinsamen Array setzen, auf den Index zu dem Prozess entsprechenden (i).Python: Multiprocessing und Array von c_char_p
Blick auf den Code unten, erzeugt die Ausgabe:
['test 0', None, None]
['test 1', 'test 1', None]
['test 2', 'test 2', 'test 2']
Warum 'test 0' von test 1
überschrieben werden, und test 1
von test 2
?
Was ich will, ist (um nicht wichtig ist):
['test 0', None, None]
['test 0', 'test 1', None]
['test 0', 'test 1', 'test 2']
Der Code:
#!/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)
ich Python läuft 2.7.3 (Ubuntu)
Vielen Dank eine Milliarde Mal! Beide Lösungen funktionieren in der Tat :) Ich bin auf den Post von J. F. Sebastian gestoßen, aber aus irgendeinem Grund konnte ich ihn nicht umsetzen ... doh! Jetzt sagst du mir, wo ich deine Statue bauen soll! Vielen Dank nochmal ... – Ujoux
Danke für die interessante Frage und deine Begeisterung! Hoffe, Sie auf Stackoverflow mehr zu sehen. Wie für Statuen - ich glaube, Sie auf den Button uparrow über dem Häkchen macht ein ziemlich genial ein; ^) – unutbu
Will tun, sobald ich die nötige Reputation von 15 haben, werde ich nicht vergessen;) – Ujoux