def
go
(self)
:
pool = multiprocessing.Pool(processes=
4
)
print
pool.map(self.f, range(
10
))
注意:如果出现
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
数据序列化
:
https://zhidao.baidu.com/question/525917268.html
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138683221577998e407bb309542d9b6a68d9276bc3dbe000
应该是说一个数据结构,比如二叉树之类,序列化以后会变成一个char数组或者一个string字符串这样,方便你存到文件里面或者通过网络传输。然后要恢复的时候就是“反序列化”,把文件里读出来/从网络收到的char数组或者string恢复成一棵二叉树或者其他什么东西。主要就是方便保存
可以被序列化的类型有:
https://zhidao.baidu.com/question/619353578954760372.html
* None,True 和 False;
* 整数,浮点数,复数;
* 字符串,字节流,字节数组;
* 包含可pickle对象的tuples,lists,sets和dictionaries;
* 定义在module顶层的函数:
* 定义在module顶层的内置函数;
* 定义在module顶层的类;
* 拥有
dict
()或
setstate
()的自定义类型;
https://stackoverflow.com/questions/8804830/python-multiprocessing-pickling-error
The problem is that the pool methods all use a queue.Queue to pass tasks to the worker processes. Everything that goes through the queue.Queue must be pickable, and foo.work is not picklable since it is not defined at the top level of the module.
It can be fixed by defining a function at the top level
大意是类中的方法不能被序列化,而进程中的参数或者函数必须被序列化,所以报错
import multiprocessing
def func(x):
return x*x
class someClass(object):
def __init__(self,func):
self.f = func
def go(self):
pool = multiprocessing.Pool(processes=4)
print pool.map(self.f, range(10))
a=someClass(func)
a.go()
defining a function at the top level
将进程需要调用的函数变成定义在module顶层的函数
解决过程中又出现的问题:
1. con = multiprocessing.Process(target=self.connect, args=(k, metrics, request, return_dict, ))
同样是PicklingError: Can’t pickle错误
原因是:
type(metrics)
<type 'dict'>
虽然metrics的类型是dict但是里面的具体内容是
'vmware_vm_net_transmitted_average': <prometheus_client.core.GaugeMetricFamily object at 0x7161650>
也会报PicklingError: Can’t pickle
可能是里里面的
<prometheus_client.core.GaugeMetricFamily object at 0x7161650>
不能被序列化
http://bbs.chinaunix.net/thread-4111379-1-1.htmlimport multiprocessingclass someClass(object): def __init__(self): pass def f(self, x): return x*x def go(self): ...
今天写了一个小脚本,因为涉及到cpu运算的事件,所以用了多进程. 因为大量复用了以前的类,就遇到了奇怪的问题。 我这里就不暴露我的业务代码,临时写了个小demo供大家测试下。
文章写的不是很严谨,欢迎来喷,另外该文后续有更新的,...
这是为 的用作示例的代码。
这些示例均已在OS X上运行的
Python
3.6.4下进行了测试。它们应可在其他操作系统和
Python
3.5+上运行,但我并没有在所有地方进行过测试。
获取 API密钥
使用pip install -r requirements.txt安装依赖项
运行示例IMGUR_CLIENT_ID=your_client_id threading_imgur.py 对于rq_imgur.py示例,您还将需要运行redis服务器。
pickle
.
Pic
k
lin
g
Error
: Can’t
pickle
<function at 0x0000016ACED65160>: attribute lookup on main failed
multiprocessing
模块不但支持多进程,
其中managers子模块还支持把多进程分布到多台机器上。
task_master.py
出现一下报错:
pickle
.
Pic
k
lin
g
Error
: Can’t
pickle
<function at 0x0000016ACED651
当您尝试将使用 Flask 框架编写的
Python
应用程序序列化(即将其转换为
pickle
格式)时,可能会遇到 Flask Attribute
Error
:“无法
pic
kel 本地对象'run.<locals>. server_forever'”。这是因为 Flask 的本地对象无法被序列化。
更具体地说,这个错误是在使用 Flask 内置发行程序时出现的。发行程序使用
multiprocessing
库将应用程序作为独立进程运行,但
multiprocessing
库依赖于
pickle
库来序列化和传递进程之间的数据。由于 Flask 中的本地对象无法被
pickle
序列化,因此会引发 Attribute
Error
。
解决此错误的方法是使用不同的服务器,例如 Gunicorn 或 uWSGI。这些服务器不依赖于
multiprocessing
库或
pickle
序列化,并且可以与 Flask 应用程序兼容。
总之,当您遇到 Flask Attribute
Error
:“无法
pic
kel 本地对象'run.<locals>. server_forever'”时,您可以使用不同的服务器来解决此问题。这么做将避免对 Flask 的本地对象进行序列化,并使您能够顺利地运行您的
Python
应用程序。
python多进程获取返回值
南国那片枫叶:
centos7 scst安装
Leon-zy:
python multiprocessing------PicklingError: Can't pickle
qq_42882155:
python多进程获取返回值
南瓜派三蔬: