2012-03-17 12 views
9

मुझे अन्य प्रक्रियाओं के लिए उपलब्ध होने के लिए एक बहुआयामी सरणी या सूचियों की सूची का साझा ऑब्जेक्ट बनाना होगा। क्या मैंने इसे देखा है इसके लिए इसे बनाने का कोई तरीका है, यह संभव नहीं है। मैंने कोशिश की है:क्या मैं मल्टीप्रोसेसिंग के लिए पाइथन में एक साझा मल्टीएरे या सूचियों की सूचियों की सूची बना सकता हूं?

from multiprocessing import Process, Value, Array 
arr = Array('i', range(10)) 
arr[:] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
arr[2]=[12,43] 
TypeError: an integer is required 

मैंने सुना numpy सरणी multiarray हो सकता है और एक, वस्तु साझा ऊपर अगर कोई मुझे बताओ कैसे एक numpy सरणी एक साझा वस्तु बनाने के लिए कर सकते हैं संभव नहीं है ??

+0

मुझे मल्टीप्रोसेसिंग भाग के बारे में निश्चित नहीं है, लेकिन मुझे पता है कि आपको टाइपरर क्यों प्राप्त हो रहा है: आपने अपनी सरणी को दूसरी पंक्ति में पूर्णांक मानों के लिए प्रारंभ किया। 5 वीं पंक्ति में, आप सरणी में किसी बिंदु पर एक सूची असाइन करने का प्रयास करते हैं। Arrays अपेक्षाकृत कम स्तर की वस्तुओं हैं और सूचियों, dicts, सेट और अन्य अजगर कंटेनर प्रकार पकड़ नहीं कर सकते हैं। –

+0

हां यही मुझे पता है, मुझे पता है कि मुझे TypeError क्यों मिल रहा है। यही कारण है कि मैं पूछ रहा हूं कि क्या इस मुद्दे को पार करने का कोई तरीका है, या साझा ऑब्जेक्ट "सूची" बनाएं, या हो सकता है कि numpy Arrays का उपयोग कैसे करें जो बहुआयामी हो और उन्हें साझा ऑब्जेक्ट्स बना सकें। – user1249212

+0

इनकी समीक्षा करें। फिर, उनके चारों ओर एक डेटा संरचना बनाएं: http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm। – MrGomez

उत्तर

21

एक numpy सरणी एक साझा वस्तु (full example) बनाने के लिए:

import ctypes as c 
import numpy as np 
import multiprocessing as mp 

n, m = 2, 3 
mp_arr = mp.Array(c.c_double, n*m) # shared, can be used from multiple processes 
# then in each new process create a new numpy array using: 
arr = np.frombuffer(mp_arr.get_obj()) # mp_arr and arr share the same memory 
# make it two-dimensional 
b = arr.reshape((n,m)) # b and arr share the same memory 

आप वस्तु और एक मात्र (के रूप में "एक ही स्मृति का हिस्सा") एक साझा की जरूरत नहीं है उद्देश्य यह है कि कई प्रक्रियाओं से इस्तेमाल किया जा सकता है तो आप इस्तेमाल कर सकते हैं पर्याप्त है multiprocessing.Manager: 012:

from multiprocessing import Process, Manager 

def f(L): 
    row = L[0] # take the 1st row 
    row.append(10) # change it 
    L[0] = row #NOTE: important: copy the row back (otherwise parent 
       #process won't see the changes) 

if __name__ == '__main__': 
    manager = Manager() 

    lst = manager.list() 
    lst.append([1]) 
    lst.append([2, 3]) 
    print(lst) # before: [[1], [2, 3]] 

    p = Process(target=f, args=(lst,)) 
    p.start() 
    p.join() 

    print(lst) # after: [[1, 10], [2, 3]] 
the docs से

सर्वर प्रक्रिया प्रबंधक साझा स्मृति ऑब्जेक्ट्स का उपयोग करने से अधिक लचीला हैं क्योंकि उन्हें मनमानी ऑब्जेक्ट प्रकारों का समर्थन करने के लिए बनाया जा सकता है। इसके अलावा, नेटवर्क पर विभिन्न कंप्यूटर पर प्रक्रियाओं द्वारा एकल प्रबंधक को साझा किया जा सकता है। हालांकि, वे साझा मेमोरी का उपयोग करने से धीमे हैं।

+0

यह एक अच्छा समाधान प्रतीत होता है, मुझे लगता है कि मैं प्रबंधकों का उपयोग करूंगा क्योंकि वे एक ऐसा समाधान प्रतीत होता है जो मेरे पूर्ववर्ती कोड में थोड़ा बदलाव करता है और तथ्य यह है कि यह नेटवर्क पर भी काम कर सकता है, यह मेरे अगले फेज के लिए आदर्श बनाता है परियोजना। – user1249212

+0

सिर्फ एक त्वरित प्रश्न, क्या प्रबंधक सूची की एक नई प्रतिलिपि बनाएंगे और फिर प्रक्रियाओं के बीच सिंक्रनाइज़ करेंगे या क्या यह सूची से स्मृति साझा करेगा? – user1249212

+0

@ user1249212: इसे मॉडल करें जैसे प्रक्रियाओं को नेटवर्क पर हमेशा वितरित किया जाता है। – jfs

2

Array एस की सूची क्यों नहीं बनाएं?

arrays = [Array('i', range(10))] * 10 
+0

असल में mooooeeeep ने [पिछले उत्तर] में यह उल्लेख किया है (http://stackoverflow.com/a/9743806/1258041) –

+0

ऐसा इसलिए है क्योंकि मुझे लगता है कि सूचियों के लिए कोई साझा ऑब्जेक्ट मौजूद नहीं है और जिस तरह से मैंने पहले अपना कोड किया था, फ़ंक्शन होना चाहिए (मैट्रिक्स 1 की पंक्तियों में से एक और मैट्रिक्स 2 की सभी पंक्तियों) से अवगत है। मुझे पता है कि कई अन्य तरीके हैं जिनमें मैं अपने मैट्रिक्स को आसानी से पुनर्गठित कर सकता हूं, मेरे लिए बहु सरणी या सूचियों की सूचियों को साझा करने की आवश्यकता नहीं है, लेकिन मैं इसे कैसे करना है, इस बारे में सभी संभावनाओं को जानना चाहता हूं। – user1249212

संबंधित मुद्दे