python2,socket多进程的错误pickle.PicklingError: Can't pickle
源码:
#coding:utf-8
import socket
import pickle
from multiprocessing import Process HTML_ROOT_DIR = "" def handle_client(client_socket):
"""处理客户端请求"""
# 获取客户端请求数据
request_data = client_socket.recv(1024)
print("request data:",request_data) # 构造响应数据
response_start_line = "HTTP/1.1 200 OK\r\n"
response_headers = "Server:My server\r\n"
response_body = "hello lijizne"
response = response_start_line + response_headers + "\r\n" + response_body
print("response data:",response) # 向客户端返回响应数据
client_socket.send(response) # 关闭客户端
client_socket.close() if __name__ == "__main__":
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("",8000))
server_socket.listen(128) while True:
client_socket,client_address = server_socket.accept()
# print("[%s, %s]用户连接上了" % (client_address[0],client_address[1]))
print("[%s, %s]用户连接上了" % client_address)
handle_client_process = Process(target=handle_client,args=(client_socket,))
handle_client_process.start()
client_socket.close()
报错:
Traceback (most recent call last):
File "F:/pythontest/pythonsocket/01_static_web_server.py", line 37, in <module>
handle_client_process.start()
File "E:\Python2\lib\multiprocessing\process.py", line 130, in start
self._popen = Popen(self)
File "E:\Python2\lib\multiprocessing\forking.py", line 277, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "E:\Python2\lib\multiprocessing\forking.py", line 199, in dump
ForkingPickler(file, protocol).dump(obj)
File "E:\Python2\lib\pickle.py", line 224, in dump
self.save(obj)
File "E:\Python2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "E:\Python2\lib\pickle.py", line 419, in save_reduce
save(state)
File "E:\Python2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "E:\Python2\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "E:\Python2\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "E:\Python2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "E:\Python2\lib\pickle.py", line 548, in save_tuple
save(element)
File "E:\Python2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "E:\Python2\lib\pickle.py", line 419, in save_reduce
save(state)
File "E:\Python2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "E:\Python2\lib\pickle.py", line 548, in save_tuple
save(element)
File "E:\Python2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "E:\Python2\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "E:\Python2\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "E:\Python2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "E:\Python2\lib\pickle.py", line 748, in save_global
(obj, module, name))
pickle.PicklingError: Can't pickle <built-in method recvfrom_into of _socket.socket object at 0x0000000002562370>: it's not found as __main__.recvfrom_into
解决:
在stackoverflow上找到了答案,是因为windows操作系统的原因,在Windows中,多进程multiprocessing使用的是序列化pickle来在多进程之间转移数据,而socket对象是不能被序列化的,但是在linux操作系统上却没问题,因为在linux上多进程multiprocessing使用的是fork,所以在windows上可以改用多线程。因为网络通信属于io密集型的操作,对cpu计算要求不高,不用多进程,用多线程就行。
参考资料:
https://stackoverflow.com/questions/33064982/how-can-i-shred-socket-object-over-python-multiprocess-it-raises-eoferror
https://github.com/dpkp/kafka-python/issues/46
https://docs.python.org/2/library/multiprocessing.html#windows
python2,socket多进程的错误pickle.PicklingError: Can't pickle的更多相关文章
- 关于tcp连接对象在多进程中的错误:pickle.PicklingError
如果需要在多进程中使用tcp连接的对象,那么不能再主进程中将这个对象创建好当做参数传给子进程,因为在创建子进程是需要序列化对象,然而socket对象是不能序列化的,会产生一个pickle.Pickli ...
- Python2.7 PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 问题解决
# 报错信息 PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.insta ...
- Nodejs发送Post请求时出现socket hang up错误的解决办法
参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段 ...
- Delphi 通信报Asynchronous socket error 10053错误的一个解决方法
在使用Delphi中的TClientSocket和TServerSocket进行通信编程时,当使用TClientSocket这方的客户端使用TClientSocket.close断开连接并退出程序时, ...
- java的Socket通信例子及关于java.net.SocketException: Socket is closed错误
今天写socket数据相互通信的时候,碰到一个及其蛋疼的错误.单向传输数据的时候server与client是没有问题的,但是两个都有输入输出操作的时候就出现了这个问题 java.net.SocketE ...
- 命令行连接mysql服务器时 报Can't connect to local MySQL server through socket 'xxx.sock'错误
本来之前用的好好的mysql服务器,突然就报Can't connect to local MySQL server through socket 'xxx.sock'错误了 遇到该问题思路首先是:检查 ...
- Linux socket多进程服务器框架一
重点:socket共用方法中错误码的定义以及错误码的解析 底层辅助代码 //serhelp.h #ifndef _vxser #define _vxser #ifdef __cplusplus ext ...
- Linux socket多进程服务器框架二
客户端未解决Bug:子进程或者父进程退出的时候,我无法做到两个进程都调用clt_socket_Destory()方式释放socket句柄, 但是进程退出后,相应的资源也会释放,有一定影响,但是不大,以 ...
- socket的一个错误的解释SocketException以及其他几个常见异常
写socket程序有可能会遇见这个问题 其他信息: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受. 这种情况我的 错误原因 ...
随机推荐
- [ansible-playbook]离线安装ansible 2.3
痛点: 测试环境无法连上外网升级ansible 预计阅读时间:5分钟 参考文档 http://docs.ansible.com/ansible/latest/intro_installation.ht ...
- CentOS阿里仓库停止openstack mitaka源服务报错------“No package centos-release-openstack-mitaka available.”
之前学习了一个月的openstack的mitaka版本,部署完后放置一段时间,最近准备正式部署突然发现“No package centos-release-openstack-mitaka avail ...
- 在Vue中加入国际化(i18n)中英文功能
1.npm安装方法 npm install vue-i18n --save 2.在src资源文件下创建文件夹i18n,i18n下面创建index.js文件,引入VueI18n和导入语言包(按开发需求可 ...
- Java知识点汇总-2
目录 1 变量的作用域 2 二维数组的定义 1 变量的作用域 实例代码: public void fight(String name){ if ("Bean".equals(nam ...
- postgresql slow sql report 慢查询报告
其实也不完全算PostgreSQL的技巧,应该算是SHELL技巧. 首先要配置好postgresql.conf,让PG记录下慢查询,并且日志固定格式,如下: log_destination = 'cs ...
- 064_将 Linux 系统中 UID 大于等于 1000 的普通用户都删除
#!/bin/bash#先用 awk 提取所有 uid 大于等于 1000 的普通用户名称#再使用 for 循环逐个将每个用户删除即可 user=$(awk -F: '$3>=1000{prin ...
- uoj #139
树链剖分//模板题由于存在换根操作对所有关于节点 u 的修改和查询操作进行分类讨论若 Root 在 u 的子树中,则不处理 u 所在的 Root 的那颗子树否则不会有影响寻找 Root 所在的那颗子树 ...
- [TJOI2013]松鼠聚会 曼哈顿距离
[TJOI2013]松鼠聚会 luogu P3964 首先容易得到两点间距离是\(max(|x_1-x_2|, |y_1-y_2|)\)(即切比雪夫距离) 然后有个套路:原\((x,y)\)求曼哈顿距 ...
- linux系列(二十):find命令
1.命令格式 find pathname -options [-print -exec -ok ...] 2.命令功能 用于在文件树种查找文件,并作出相应的处理 3.命令参数 pathname: fi ...
- NetworkX系列教程(5)-查看graph的信息
小书匠Graph图论 有时候graph建好后,我们并不清除该graph内节点的,边的信息,这就需要调用函数去查看了. 目录: 6.查看Graph的信息 6.1查看graph内节点,边的 6.2查看gr ...