python2,socket多进程的错误pickle.PicklingError: Can't pickle <built-in method recvfrom_into of _socket.soc
2017-07-22 15:27
513 查看
源码:
#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
相关文章推荐
- python multiprocessing.Pool - PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
- Python: joblib.Parallel method in a class 'TypeError : can't pickle instancementhod objects'
- python3 PicklingError: Can't pickle <function <lambda> at......> attribute lookup <lambda> on __main
- Python2.7 pip编码错误UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in解决方法
- docker python 提示错误UnicodeEncodeError: 'ascii' codec can't encode characters in position
- python调用py方法,报错【ValueError: no such test method in <class 'mytestcase.MyTestCase'>: runTest】
- python multiprocessing------PicklingError: Can't pickle
- Python <built-in method items of dict object at 0x0000000002B6C8C8> 问题解决
- PicklingError: Can't pickle <type 'thread.lock'>: attribute lookup thread.lock failed
- 关于tcp连接对象在多进程中的错误:pickle.PicklingError
- pickle.PicklingError: Can't pickle <function <lambda>
- Python--错误SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: tru
- Python中UnicodeDecodeError:‘XXX’ codec can’t decode bytes in position错误信息解决办法
- python编码错误:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position xxx ordinal not in
- recvfrom 错误 GetLastError() SOCKET_ERROR 100142008年12月23日 星期二 11:48 A.M.int PASCAL FAR recvfrom( SOCK
- 解决Python中导出图片出现的错误SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position
- 多进程---错误解决AttributeError: Can't get attribute 'long_time_task' on <module '__main__' (built-in)>
- Python 错误:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position...
- 调查 PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
- Python错误解决:UnicodeEncodeError: 'latin-1' codec can't encode characters in position