TypeError:无法腌制thread.lock对象

时间:2020-05-18 19:23:29

标签: python multithreading python-2.7 multiprocessing pickle

我正在将一些代码从python 3移植到python 2.7,以便它可以与ROS工具集成,并遇到了pickle thread.lock错误的问题。

在python 3中运行时,一切正常,并且代码的多处理部分没有更改。

这是错误的代码。

from bin.gui.mainWindow_ui import *

from bin.client.Server import Server
from bin.common.Logger import Logger as log
from bin.common.Constants import Constants as con
from bin.parse.Data_NoROS import Data as data
from multiprocessing import Process, Pipe
import os
import time

LOG = log('DEBUG')
DATA = data()
SERVER = Server(DATA, LOG)

TAG = "MainWindow"


class MainWindow(QtWidgets.QMainWindow):
    """
    Handles the ui elements and connects to worker service to execute processes.
    """

    def __init__(self):
        """
        Initializes values for the UI.
        """
        QtWidgets.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.running = False

        # configures
        self._configure_signals()

        # enable ui
        self._enable_ui()
        self.ui.textEdit_2.setText('     Not Connected')

        # setup server process
        self.gui_conn, self.data_conn = Pipe()
        self.listenProcess = Process(target=SERVER.Listen, args=(self.data_conn,))

    def Connect(self):
        """
        Starts the server process for acquisition of the selected serial port.
        This function is connected to the clicked signal of the Start button.
        """
        self.running = True
        LOG.i(TAG, "User clicked CONNECT")

        self.listenProcess.start()
        LOG.i(TAG, "Started Server Process as: PID".format(os.getpid()))

        self.ui.textEdit_2.setTextColor(QtCore.Qt.darkGreen)
        self.ui.textEdit_2.setText('\tSYSTEM READY')

        self.UpdateGUI()

一旦我进入self.listenProcess.start(),就会收到以下错误消息

Traceback (most recent call last):
  File "I:\eCHRApplication\bin\gui\mainWindow.py", line 60, in Connect
    self.listenProcess.start()
  File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\process.py", line 130, in start
    self._popen = Popen(self)
  File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\forking.py", line 277, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\forking.py", line 199, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
    save(state)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\forking.py", line 67, in dispatcher
    self.save_reduce(obj=obj, *rv)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 401, in save_reduce
    save(args)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 554, in save_tuple
    save(element)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
    save(state)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 731, in save_inst
    save(stuff)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 692, in _batch_setitems
    save(v)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
    save(state)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 606, in save_list
    self._batch_appends(iter(obj))
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 642, in _batch_appends
    save(tmp[0])
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
    save(state)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 425, in save_reduce
    save(state)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 687, in _batch_setitems
    save(v)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 306, in save
    rv = reduce(self.proto)
TypeError: can't pickle thread.lock objects

(base) I:\eCHRApplication>Initializing server object
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\Desktop\Anaconda2\lib\multiprocessing\forking.py", line 381, in main
    self = load(from_parent)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 1384, in load
    return Unpickler(file).load()
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 864, in load
    dispatch[key](self)
  File "C:\Users\Desktop\Anaconda2\lib\pickle.py", line 886, in load_eof
    raise EOFError
EOFError

任何帮助将不胜感激!

0 个答案:

没有答案