Python Травление и многопроцессорность

Я пытаюсь использовать многопроцессорную обработку, чтобы получить информацию о проблемах с моей памятью, однако я не могу получить функцию для раскалывания, и я понятия не имею, почему. Мой основной код начинается с

def main(): print "starting main" q = Queue() p = Process(target=file_unpacking,args=("hellow world",q)) p.start() p.join() if p.is_alive(): p.terminate() print "The results are in" Chan1 = q.get() Chan2 = q.get() Start_Header = q.get() Date = q.get() Time = q.get() return Chan1, Chan2, Start_Header, Date, Time def file_unpacking(args, q): print "starting unpacking" fileName1 = "050913-00012" unpacker = UnpackingClass() for fileNumber in range(0,44): fileName = fileName1 + str(fileNumber) + fileName3 header, data1, data2 = UnpackingClass.unpackFile(path,fileName) if header == None: logging.warning("curropted file found at " + fileName) Data_Sets1.append(temp_1) Data_Sets2.append(temp_2) Headers.append(temp_3) temp_1 = [] temp_2 = [] temp_3 = [] #for i in range(0,10000): # Chan1.append(0) # Chan2.append(0) else: logging.info(fileName + " is good!") temp_3.append(header) for i in range(0,10000): temp_1.append(data1[i]) temp_2.append(data2[i]) Data_Sets1.append(temp_1) Data_Sets2.append(temp_2) Headers.append(temp_3) temp_1 = [] temp_2 = [] temp_3 = [] lengths = [] for i in range(len(Data_Sets1)): lengths.append(len(Data_Sets1[i])) index = lengths.index(max(lengths)) Chan1 = Data_Sets1[index] Chan2 = Data_Sets2[index] Start_Header = Headers[index] Date = Start_Header[index][0] Time = Start_Header[index][1] print "done unpacking" q.put(Chan1) q.put(Chan2) q.put(Start_Header) q.put(Date) q.put(Time) 

и в настоящее время у меня есть метод распаковки в отдельном файле python, который импортирует struct и os. Это считывает двоичный файл части текста части текста, структурирует его и затем закрывает. Это в основном работа с ногами, поэтому я не буду публиковать ее, но если это поможет, я это сделаю. Я дам начало

 class UnpackingClass: def __init__(self): print "Unpacking Class" def unpackFile(path,fileName): import struct import os ....... 

Затем я просто вызываю main (), чтобы запустить партию, и я получаю только бесконечный цикл ошибок рассола.

Короче говоря, я понятия не имею, как рассолить функцию. Все определяется в верхней части файлов, поэтому я в недоумении.

Вот сообщение об ошибке

 Traceback (most recent call last): File "<string>", line 1, in <module> File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\multiprocessing\forking.py", line 373, in main prepare(preparation_data) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\multiprocessing\forking.py", line 488, in prepare '__parents_main__', file, path_name, etc File "A:\598\TestCode\test1.py", line 142, in <module> Chan1, Chan2, Start_Header, Date, Time = main() File "A:\598\TestCode\test1.py", line 43, in main p.start() File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\multiprocessing\process.py", line 130, in start self._popen = Popen(self) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\multiprocessing\forking.py", line 271, in __init__ dump(process_obj, to_child, HIGHEST_PROTOCOL) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\multiprocessing\forking.py", line 193, in dump ForkingPickler(file, protocol).dump(obj) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\pickle.py", line 224, in dump self.save(obj) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\pickle.py", line 331, in save self.save_reduce(obj=obj, *rv) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\pickle.py", line 419, in save_reduce save(state) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\pickle.py", line 286, in save f(self, obj) # Call unbound method with explicit self File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\pickle.py", line 649, in save_dict self._batch_setitems(obj.iteritems()) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\pickle.py", line 681, in _batch_setitems save(v) File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\pickle.py", line 286, in save f(self, obj) # Call unbound method with explicit self File "C:\Users\Casey\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.1.0.1371.win-x86_64\lib\pickle.py", line 748, in save_global (obj, module, name)) pickle.PicklingError: Can't pickle <function file_unpacking at 0x0000000007E1F048>: it's not found as __main__.file_unpacking 

Травление функции – очень важная вещь, если вы хотите выполнять параллельные вычисления. pickle и multiprocessing Python довольно нарушены для параллельных вычислений, поэтому, если вы не отрицаете выхода за пределы стандартной библиотеки, я бы предложил dill для сериализации и pathos.multiprocessing в качестве замены multiprocessing . dill может сериализовать почти что угодно в python, а pathos.multiprocessing использует dill для обеспечения более надежного параллельного использования ЦП. Для получения дополнительной информации см.

Что может сделать многопроцессорность и укроп?

или этот простой пример:

 Python 2.7.6 (default, Nov 12 2013, 13:26:39) [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import dill >>> from pathos.multiprocessing import ProcessingPool >>> >>> def squared(x): ... return x**2 ... >>> pool = ProcessingPool(4) >>> pool.map(squared, range(10)) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> res = pool.amap(squared, range(10)) >>> res.get() [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> res = pool.imap(squared, range(10)) >>> list(res) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> >>> def add(x,y): ... return x+y ... >>> pool.map(add, range(10), range(10)) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> res = pool.amap(add, range(10), range(10)) >>> res.get() [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> res = pool.imap(add, range(10), range(10)) >>> list(res) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

Оба dill и pathos доступны здесь: https://github.com/uqfoundation

Вы можете технически рассортировать функцию. Но это только ссылка на имя, которая сохраняется. Когда вы распаковываете, вы должны настроить среду, чтобы ссылка на название имела смысл для python. Обязательно прочитайте, что можно тщательно мариновать и рассыпать .

Если это не ответит на ваш вопрос, вам необходимо предоставить нам точные сообщения об ошибках. Также, пожалуйста, объясните назначение травления функции. Так как вы можете рассортировать ссылку на имя, а не саму функцию, почему вы не можете просто импортировать и вызывать соответствующий код?