问题:
我正在以下回溯,不明白这意味着什么或如何解决它:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main
self = load(from_parent)
File "C:\Python26\lib\pickle.py", line 1370, in load
return Unpickler(file).load()
File "C:\Python26\lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Python26\lib\pickle.py", line 1083, in load_newobj
obj = cls.__new__(cls, *args)
TypeError: object.__new__(pyodbc.Cursor) is not safe, use pyodbc.Cursor.__new__()
这种情况:
我有要处理的SQL Server数据库的完整数据的。 我试图用多模块并行工作,并把我的电脑上的多核的优势。 我一般的类结构如下:
- MyManagerClass
- 这是主类,其中程序将启动。
- 它创建两个multiprocessing.Queue对象,一个
work_queue
和一个write_queue
- 它还创建并启动其他进程,然后等待他们完成。
- 注:这是不是 multiprocessing.managers.BaseManager的扩展()
- MyReaderClass
- 这个类读取从SQL Server数据库中的数据。
- 它把项目的
work_queue
。
- MyWorkerClass
- 这是工作的处理情况。
- 它从项目
work_queue
并把完成的项目write_queue
。
- MyWriterClass
- 这个类是负责写处理的数据返回给SQL Server数据库。
- 它从项目
write_queue
。
我们的想法是,将有一个经理,一个读卡器,一个作家,和许多工人。
其他详情:
我得到的回溯两次在标准错误,所以我想,这对作家来说,发生一次为读者和一次。 我的工作进程获得创建罚款,但只是坐在那里,直到我发一个KeyboardInterrupt因为他们没有在work_queue
。
无论是读者与作者有自己的数据库连接,在初始化时创建的。
解:
由于马克和费迪南德·拜尔对他们的答案和问题,导致这一解决方案。 他们理所当然地指出,Cursor对象不是“泡菜-能”,这是多使用在进程间传递信息的方法。
我的代码的问题是, MyReaderClass(multiprocessing.Process)
和MyWriterClass(multiprocessing.Process)
都连接到数据库中的__init__()
方法。 我创建了两个对象(即所谓的init()方法)在MyManagerClass
,然后叫start()
。
因此,这将创建连接和游标对象,然后尝试通过咸菜把它们发送到子进程。 我的解决办法是把连接和光标对象的实例移到run()方法,它不叫,直到子进程是完全建立。