源码:
#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

最新文章

  1. CentOS yum的详细使用方法
  2. 除非 Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。目前,这两项服务均处于停止状态。
  3. 变形--旋转 rotate()
  4. select,poll,epoll的归纳总结区分
  5. safeseh+dep保护绕过
  6. YTU 2619: B 友元类-计算两点间距离
  7. GET和POST的区别,就是明信片和信封的区别
  8. 一个简洁通用的调用DLL函数的帮助类
  9. linux下如何删除文件夹
  10. .NET基础拾遗(7)多线程开发基础4
  11. spring的CXF远程服务
  12. SQLServer2014新功能
  13. linux kernel 编译
  14. Dubbo入门实例 本地伪集群测试Demo
  15. external 里面文件的介绍
  16. SQL表连接查询(inner join(join)、full join、left join、right join、cross join)
  17. set 利用lower_bound实现key索引
  18. 微信小程序域名
  19. C++ Coroutine简明教程
  20. 2019浙江省赛B zoj4101 Element Swapping(推公式)

热门文章

  1. 动态规划——python
  2. Spring Cloud 之 服务网关
  3. Socket的一些疑惑整理
  4. 2. kafka
  5. NodeJS 开发博客(四) 日志及安全攻击
  6. TODO: Android UI测试 UIAutomator
  7. (一)AppScan的安装及破解
  8. Unable to open debugger port (127.0.0.1:63959): java.net.SocketException &quot;socket closed&quot;,编译过来就是无法打开调试器端口,套接字已关闭
  9. java中的AIO
  10. java中使用redis --- List列表的简单应用