Python 使用pexpect和多处理时出错?“错误”;TypeError:无法序列化'_io.TextIOWrapper';“对象”;
我在Linux机器上有一个Python 3.7脚本,我试图在多线程中运行函数,但当我尝试时,我收到以下错误:Python 使用pexpect和多处理时出错?“错误”;TypeError:无法序列化'_io.TextIOWrapper';“对象”;,python,linux,multiprocessing,pexpect,Python,Linux,Multiprocessing,Pexpect,我在Linux机器上有一个Python 3.7脚本,我试图在多线程中运行函数,但当我尝试时,我收到以下错误: Traceback (most recent call last): File "./test2.py", line 43, in <module> pt.ping_scanx() File "./test2.py", line 39, in ping_scanx par = Parallel(function=self.pingx, paramete
Traceback (most recent call last):
File "./test2.py", line 43, in <module>
pt.ping_scanx()
File "./test2.py", line 39, in ping_scanx
par = Parallel(function=self.pingx, parameter_list=list, thread_limit=10)
File "./test2.py", line 19, in __init__
self._x = self._pool.starmap(function, parameter_list, chunksize=1)
File "/usr/local/lib/python3.7/multiprocessing/pool.py", line 276, in starmap
return self._map_async(func, iterable, starmapstar, chunksize).get()
File "/usr/local/lib/python3.7/multiprocessing/pool.py", line 657, in get
raise self._value
File "/usr/local/lib/python3.7/multiprocessing/pool.py", line 431, in _handle_tasks
put(task)
File "/usr/local/lib/python3.7/multiprocessing/connection.py", line 206, in send
self._send_bytes(_ForkingPickler.dumps(obj))
File "/usr/local/lib/python3.7/multiprocessing/reduction.py", line 51, in dumps
cls(buf, protocol).dump(obj)
TypeError: cannot serialize '_io.TextIOWrapper' object
如果我没有将该行包含在pexpect.spawn中,则不会发生错误。有人能解释我为什么会出现错误,并提出一种解决方法吗?使用
多处理.Pool
您实际上是作为单独的进程而不是线程调用函数。进程不能共享Python对象,除非先对它们进行序列化,然后再通过处理间通信通道相互传输,这就是multiprocessing.Pool
在幕后使用pickle
作为序列化程序所做的。由于pexpect.spawn
以类似TextIOWrapper
对象的文件形式打开终端设备,您将返回的对象存储在PingTest
实例中,然后将绑定方法self.pingx
传递到Pool.starmap
,它将尝试序列化self
,它包含\u pex
属性中的pexpect.spawn
对象,但由于TextIOWrapper
不支持序列化,因此无法序列化该对象
由于您的函数是I/O绑定的,因此您应该通过模块使用线程来实现更高效的并行化,更重要的是,在这种情况下,允许跨线程共享pexpect.spawn
对象,而无需序列化
更改:
from multiprocessing import Pool
致:
演示:
from multiprocessing import Pool
from multiprocessing.dummy import Pool