Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pexpect和多处理时出错?“错误”;TypeError:无法序列化'_io.TextIOWrapper';“对象”;_Python_Linux_Multiprocessing_Pexpect - Fatal编程技术网

Python 使用pexpect和多处理时出错?“错误”;TypeError:无法序列化'_io.TextIOWrapper';“对象”;

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

我在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, 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