का मल्टीप्रोसेसिंग और ऐरे मैं 3 प्रक्रियाओं को लॉन्च कर रहा हूं और मैं चाहता हूं कि वे एक साझा सरणी, प्रक्रिया के अनुरूप सूचकांक में एक स्ट्रिंग डालें। (I)। नीचे दिए गए कोड मेंपायथन: c_char_p
देखो, उत्पन्न उत्पादन होता है:
['test 0', None, None]
['test 1', 'test 1', None]
['test 2', 'test 2', 'test 2']
क्यों 'परीक्षण 0' test 1
द्वारा ओवरराइट, और test 1
test 2
द्वारा?
मैं क्या चाहते हैं (क्रम महत्वपूर्ण नहीं है) है:
['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)
मैं अजगर 2.7.3 (उबंटू) चल रहा हूँ
धन्यवाद अरबों बार! आपके दोनों समाधान वास्तव में काम कर रहे हैं :) मैं जेएफ सेबेस्टियन के उस पद पर आया लेकिन किसी कारण से इसे लागू नहीं कर सका ... दोह! अब आप मुझे बताओ कि मुझे अपनी मूर्ति बनाना चाहिए! फिर से धन्यवाद ... – Ujoux
दिलचस्प सवाल और उत्साह के लिए धन्यवाद! Stackoverflow पर आपको और अधिक देखने की उम्मीद है। मूर्तियों के लिए - मुझे लगता है कि चेक मार्क के ऊपर उपरोक्त पर क्लिक करना एक बहुत ही बढ़िया बनाता है; ^) – unutbu
जैसे ही मेरी 15 की जरूरी प्रतिष्ठा होगी, मैं नहीं भूलूंगा;) – Ujoux