源码:
#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的更多相关文章

  1. 关于tcp连接对象在多进程中的错误:pickle.PicklingError

    如果需要在多进程中使用tcp连接的对象,那么不能再主进程中将这个对象创建好当做参数传给子进程,因为在创建子进程是需要序列化对象,然而socket对象是不能序列化的,会产生一个pickle.Pickli ...

  2. Python2.7 PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 问题解决

    # 报错信息 PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.insta ...

  3. Nodejs发送Post请求时出现socket hang up错误的解决办法

    参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段 ...

  4. Delphi 通信报Asynchronous socket error 10053错误的一个解决方法

    在使用Delphi中的TClientSocket和TServerSocket进行通信编程时,当使用TClientSocket这方的客户端使用TClientSocket.close断开连接并退出程序时, ...

  5. java的Socket通信例子及关于java.net.SocketException: Socket is closed错误

    今天写socket数据相互通信的时候,碰到一个及其蛋疼的错误.单向传输数据的时候server与client是没有问题的,但是两个都有输入输出操作的时候就出现了这个问题 java.net.SocketE ...

  6. 命令行连接mysql服务器时 报Can't connect to local MySQL server through socket 'xxx.sock'错误

    本来之前用的好好的mysql服务器,突然就报Can't connect to local MySQL server through socket 'xxx.sock'错误了 遇到该问题思路首先是:检查 ...

  7. Linux socket多进程服务器框架一

    重点:socket共用方法中错误码的定义以及错误码的解析 底层辅助代码 //serhelp.h #ifndef _vxser #define _vxser #ifdef __cplusplus ext ...

  8. Linux socket多进程服务器框架二

    客户端未解决Bug:子进程或者父进程退出的时候,我无法做到两个进程都调用clt_socket_Destory()方式释放socket句柄, 但是进程退出后,相应的资源也会释放,有一定影响,但是不大,以 ...

  9. socket的一个错误的解释SocketException以及其他几个常见异常

    写socket程序有可能会遇见这个问题  其他信息: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受.  这种情况我的 错误原因 ...

随机推荐

  1. 【DevOps】在CentOS中安装Rancher2,并配置kubernetes集群

    准备 一台CentOS主机,安装DockerCE,用于安装Rancher2 一台CentOS主机,安装DockerCE,用于安装kubernetes集群管理主机 多台CentOS主机,安装Docker ...

  2. tinymce + vue 富文本编辑

    用texterea最多支持换行,如果文本信息想要更加丰富一些,比如增加格式样式,比如增加图片,textarea就爱莫能助了 在网上搜寻了一番,发现tinymce是比较方便好用的一款富文本编辑 http ...

  3. MathJax.js是做什么的

    MathJax.js是做什么的 一.总结 一句话总结: 用 MathJax 可以在浏览器页面很美观的显示数学公式 1.MathJax 语法? $$...$$之间是单行公式,$...$之间是行内公式 实 ...

  4. .NET Core WebAPI IIS 部署问题

    虽然建了 .NET Core 的项目,基本的一些功能也实现了,运行什么的也没有问题,但是一直没有直接发布. 今天就进行了发布测试,结果问题还是来了,只是你不去做自然就不会出现. 一.基本发布 1.先是 ...

  5. List集合和Set集合UML图总结

    1.List和Set,用RationalRose展示 2.Map

  6. Spring Cloud Eureka 注册中心高可用机制

    一.Eureka 正常工作流程 Service 服务作为 Eureka Client 客户端需要在启动的时候就要向 Eureka Server 注册中心进行注册,并获取最新的服务列表数据. Eurek ...

  7. jquery点击显示或隐藏

    点击第一个dd,给第一li添加class,点击第二个dd,给第二个li添加class,以此类推 $(function(){     $("dd > a").click(fun ...

  8. [TJOI2015]弦论(第k小子串)

    题意: 对于一个给定的长度为n的字符串,求出它的第k小子串. 有参数t,t为0则表示不同位置的相同子串算作一个,t为1则表示不同位置的相同子串算作多个. 题解: 首先,因为t的原因,后缀数组较难实现, ...

  9. 提高 github.com 项目下载速度

    1 注册一个 github.com 账号 2 进入你感兴趣的项目 3 Fork  一个副本到你的账号之下 4 git clone https://github.com/your-name/fork-p ...

  10. P2734 游戏 A Game

    题目背景 有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的得分中 ...