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
最新文章
- CentOS yum的详细使用方法
- 除非 Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。目前,这两项服务均处于停止状态。
- 变形--旋转 rotate()
- select,poll,epoll的归纳总结区分
- safeseh+dep保护绕过
- YTU 2619: B 友元类-计算两点间距离
- GET和POST的区别,就是明信片和信封的区别
- 一个简洁通用的调用DLL函数的帮助类
- linux下如何删除文件夹
- .NET基础拾遗(7)多线程开发基础4
- spring的CXF远程服务
- SQLServer2014新功能
- linux kernel 编译
- Dubbo入门实例 本地伪集群测试Demo
- external 里面文件的介绍
- SQL表连接查询(inner join(join)、full join、left join、right join、cross join)
- set 利用lower_bound实现key索引
- 微信小程序域名
- C++ Coroutine简明教程
- 2019浙江省赛B zoj4101 Element Swapping(推公式)
热门文章
- 动态规划——python
- Spring Cloud 之 服务网关
- Socket的一些疑惑整理
- 2. kafka
- NodeJS 开发博客(四) 日志及安全攻击
- TODO: Android UI测试 UIAutomator
- (一)AppScan的安装及破解
- Unable to open debugger port (127.0.0.1:63959): java.net.SocketException ";socket closed";,编译过来就是无法打开调试器端口,套接字已关闭
- java中的AIO
- java中使用redis --- List列表的简单应用