尝试动态调整python多处理数组大小的问题

时间:2019-12-09 16:53:13

标签: python multiprocessing

编辑:添加了最小可重现的问题示例

我正在尝试创建一个包装器类,以模拟线程安全的ArrayList。所有方法似乎都可以正常工作,但是resizeBackingArray方法不起作用。我已经收集到这是因为我要重新分配属于该对象而不是该类的值,所以调整大小的后备数组对所有线程都不可见。

解决此问题的最佳方法是什么?我知道multiprocessing.manager具有使用列表的功能,但是我希望使用更快的ctype数组。

您会在输出中注意到,由于将15个元素添加到初始容量为10的数组中,因此必须调整数组的大小。但是,在调整大小之后,main.py可用的列表副本具有一个长度为10,而大小已增加为15。

输出:

Resizing
Size of Array: 15
Length of Array: 10
Done!

来自main.py

def addToList(aList):
     for x in range(0, 15):
          aList.add(x)

if __name__ == "__main__": 
     import sys
     safeArray = ThreadSafeArray.SafeArrayList()
     p3 = multiprocessing.Process(target=addToList, args=(safeArray,)) 
     p3.start()
     p3.join()
     print("Size of Array: " + str(safeArray.getSize()))
     print("Length of Array: " + str(safeArray.lengthOfBackingArray()))
     print("Done!") 

来自ThreadSafeArray.py

import multiprocessing
import sys, traceback
class SafeArrayList:

     def __init__(self, initSize = 10):
          self.arr = multiprocessing.Array('i', initSize)
          self.size = multiprocessing.Value('i', 0)
          self.lock = multiprocessing.RLock()
     #Doubles the size of the array
     def resizeBackingArray(self):
          #print("resizing")
          with self.lock:
               newArr = multiprocessing.Array('i', self.size.value * 2)
               for num in range(0,self.size.value):
                    newArr[num] = self.arr[num]
               self.arr = newArr
     def add(self, num):
          with self.lock:
               try:
                    if self.size.value == len(self.arr):
                         print("Resizing")
                         self.resizeBackingArray()
                    if self.size.value == len(self.arr):
                         print("ERROR")
                    self.arr[self.size.value] = num
                    self.size.value = self.size.value + 1

               except:
                    print ('-'*60)
                    print("Error")
                    print(sys.exc_info())
                    traceback.print_exc(file=sys.stdout)
                    print ('-'*60)
                    print("Printing " + str(num))
                    print("Size = " + str(self.size.value) + "\nLength = " + str(len(self.arr)))
                    self.printArray()


     def get(self, index):
          with self.lock:
               if index < 0 or index >= self.size.value:
                    return None
               else:
                    return self.arr[index]

     def getSize(self):
          return self.size.value

     def lengthOfBackingArray(self):
          return len(self.arr)

     def printArray(self):
          print("Printing Array")
          for x in range(0, self.size.value):
                    print(str(self.arr[x]))

0 个答案:

没有答案