1.1版的更改#
1.1.2(2016年7月21日)#
Python 2:
sendall
在非阻塞的套接字上,可能会出现假故障并超时。如果
sys.stderr
已进行猴修补(不推荐),但集线器报告没有丢失,仍然可以捕获的例外。报告时间: issue #825 杰尔·斯密特。selectors.SelectSelector
不管进口订单如何,都要正确地修补。报告时间: issue #835 作者:Przemys_aw w_grzyn。Python 2:
reload(site)
不再失败TypeError
如果Gevent已经进口。报告时间: issue #805 杰克·希尔顿。
1.1.1(2016年4月4日)#
设置和清除事件的嵌套回调不再导致
wait
过早返回。报告时间: issue #771 作者:Sergey Vasilyev。在Solaris 10上修复内部版本。报告时间: issue #777 作者:Wiggin15。
这个
ref
参数到gevent.os.fork_and_watch()
被忽略。Python 3:
gevent.queue.Channel
现在可以正确地进行迭代,而不是提升TypeError
.python 3:添加对
socket.socket.sendmsg()
,socket.socket.recvmsg()
和socket.socket.recvmsg_into()
在定义它们的平台上。首字母 pull request #773 作者:Jakub Klama。
1.1.0(2016年3月5日)#
Python 3:有补丁的猴子
threading.RLock
现在适当地阻塞(或死锁)acquire
如果默认值为 超时 使用的是-1(不同于gevent的默认值none)。这个acquire
方法也会引发相同的ValueError
标准库对无效参数执行的异常。报告时间: issue #750 郑大喜。修正比赛条件
Event
所以它又回来了False
当事件被相同的greenlet设置和清除后,才允许切换到已经等待的greenlet。(由3.4和3.5标准库测试套件找到;与python相同 bug 13502 . 注意,python 2标准库仍然有这个竞争条件。)Event
和AsyncResult
现在以相同(未指定)的顺序唤醒等待的绿小菜。以前,AsyncResult
倾向于使用先进先出订单,但这从未得到保证。这两个类也使用较少的每个实例内存。使用A
Logger
作为一个pywsgi
错误或请求日志流不再产生额外的换行符。报告时间: issue #756 根据AEL规范。Windows:从pypi上的sdist(.tar.gz)安装不再需要先安装cython。(请注意,在Windows上首选二进制安装格式(Wheels、Exes、MSI)。报告于 issue #757 内德·巴切尔德。
在以下情况下发出警告:
patch_all()
被调用os
设置为假( not 违约)但是signal
仍然为真(默认值)。此参数组合将导致SIGCHLD
不被呼叫。将来,这可能会导致错误。乔希·祖克报道。在以下情况下发出警告:
patch_all()
使用不同的参数多次调用。这会导致所有真参数的累积集被修补,这可能会导致意外的结果。修复返回某些
threading
属性来自gevent.monkey.get_original()
.
1.1RC5(2016年2月24日)#
ssl:尝试使用发送空数据
sendall()
具有超时的gevent ssl套接字的方法现在立即返回(与标准库一样),而不是错误地引发ssl.SSLEOFError
. (请注意,使用send()
方法 does 提升SSLEOFError
在gevent和标准库中)报告 issue #719 由Mustafa Atik和Tymur Maryokhin提供,Timo Savola提供了一个可复制的测试案例。
1.1RC4(2016年2月16日)#
python 2:在导入时使用阻塞API,当多个greenlet同时导入时,不应导致
LoopExit
. 报告时间: issue #728 加勒特高跟鞋。Python 2:不要升高
OverflowError
当使用readline
当客户端上载大量数据时,不带大小提示或带有大大小提示的wsgi输入流的方法。(这只影响了cpython 2;pypy和python 3已经处理了这一点。)中报告 issue #289 作者:Ggjlldd,作者:Nathan Hoad。BaseServer
它的子类是WSGIServer
避免为每个请求分配新的闭包,从而减少开销。python 2:在2.7.9及更高版本下(或当PEP 466 SSL接口可用时),执行与标准库相同的主机名验证;以前跳过了这一点。另外,阅读、写作或握手
SSLSocket
现在提高同样的水平ValueError
标准库可以,而不是AttributeError
. 通过更新gevent的标准库测试用例副本找到。最初报告于 issue #735 作者:Dmitrij D.Czarkoff。python 3:修复
unwrap()
以及SNI的回电。同时对未连接的SSL套接字提出正确的异常,并正确验证SSL主机名。通过更新的标准库测试找到。python 3:添加缺少的对
socket.socket.sendfile()
. 通过更新的标准库测试找到。python 3.4+:添加对
socket.socket.get_inheritable()
和set_inheritable()
. 通过更新的标准库测试找到。
1.1RC3(2016年1月4日)#
python 2:支持新的pep 466
ssl
提供它们的任何python 2版本上的接口,而不仅仅是它正式附带的版本。一些Linux发行版,包括Redhat/CentOS和Amazon,已经将更改反向移植到旧版本。报告时间: issue #702 .pypy:Cython编译的代码和垃圾收集器之间的交互导致pypy在以前分配的信号量用于
__del__
方法,在流行的库中执行的操作requests
和urllib3
. 由于这个和其他与cython相关的问题,cython不再在pypy上编译信号量类。这意味着它现在是可追踪的,并不像赛通版本那样具有原子性,尽管整体语义应该保持不变。报告时间: issue #704 肖恩·克拉普顿。pypy:优化cffi后端以使用更少的内存(每个观察者有两个指针)。
python 3:wsgi
PATH_INFO
条目是使用拉丁文-1而不是UTF-8从URL转义中解码的。这提高了对PEP 3333的遵从性和与Django等一些框架的兼容性。固定在 pull request #712 由鲁本·德维舍尔撰文。
1.1RC2(2015年12月11日)#
gevent的ssl套接字引发的异常更符合标准库(例如,gevent的python 3 ssl套接字引发
socket.timeout
而不是ssl.SSLError
在python 3.2中引入了一个更改)。python 2:gevent的套接字
sendall
方法在某些情况下可以完全忽略超时。超时现在是指sendall
.Gevent的SSL套接字
sendall
方法不应再提升SSL3_WRITE_PENDING
在极少数情况下,当发送大型缓冲区时。报告时间: issue #317 .gevent.signal.signal()
现在允许重置(sig_dfl)和忽略(sig_ign)进程级别的sigchld信号(尽管这可能允许与libev子观察程序的争用条件)。报告时间: issue #696 作者:亚当·宁。gevent.spawn_raw()
现在接受关键字参数,正如以前(错误地)记录的那样。报告时间: issue #680 罗恩罗斯曼。PYPY:现在需要PYPY 2.6.1或更高版本(建议使用4.0.1或更高版本)。
cffi后端现在在cpython实现上构建并可用(在Windows上除外),如果
cffi
在安装Gevent之前安装。要使用cffi后端,请设置环境变量GEVENT_CORE_CFFI_ONLY
在启动python之前。在某些情况下,这有助于调试,并有助于确保所有受支持平台组合的奇偶性。cffi后端现在调用观察者的回调
args
属性设置为None
就像赛通后端一样。它也只允许args
是一个元组或None
,再次匹配cython后端。pypy/cffi:修复使用stat watchers时可能发生的崩溃。
pypy/cffi:使用
sys.getfilesystemencoding()
就像赛通后端。内部实现模块
gevent._fileobject2
,gevent._fileobject3
和gevent._util
已删除。自1.1b1以来,这些设备尚未使用或测试。
1.1RC1(2015年11月14日)#
Windows/python 3:完成移植
gevent.subprocess
模块,修复大量失败的测试。故障示例如下 issue #668 和 issue #669 由斯罗斯报道。python 3:sslsocket类应返回空的
bytes
对象,而不是str
. 固定在 pull request #674 作者:Dahong Kim。python 2:解决stdlib中的缓冲错误
io
导致FileObjectPosix
在某些情况下比需要的慢。报告时间: issue #675 作者:wgh-。Pypy:修复一个崩溃。报告时间: issue #676 杰伊·奥斯特。
小心
还有一些相对罕见的Pypy崩溃,但其最终原因尚不清楚(Gevent、CFFI、Greenlet、Pypy GC?).pypy用户可以 issue #677 帮助追踪他们。
pypy:处理循环回调函数引发的错误时引发的异常的行为类似于cpython实现:异常被打印,其余回调继续处理。
如果一个具有活动观察程序的中心对象被破坏,然后为同一线程创建另一个中心对象,然后用
destroy_loop=True
,进程可能崩溃。记录在 issue #237 并根据 pull request #238 均出自Jan Philip Gehrcke。python 3:在多个本机后台线程中首次同时初始化gevent的hub可能会失败
AttributeError
和ImportError
. 报告时间: issue #687 作者:Gregory Petukhov。
1.1B6(2015年10月17日)#
pypy:修复为分配和处理多个代码的内存泄漏
gevent.lock.Semaphore
子类。如果猴子修补了,这也适用于threading.Semaphore
物体。报告时间: issue #660 杰伊·奥斯特。pypy:cython版本0.23.4或更高版本必须用于避免内存泄漏 (details) . 多亏了杰伊·奥斯特。
允许子类
WSGIHandler
处理无效的HTTP客户端请求。不是鲍勃报道的。WSGIServer
更有力的支持Logger
-类似的参数log
和error_log
(如1.1b1所述,这可能导致与Gunicorn的集成问题)。报告时间: issue #663 杰伊·奥斯特。_DummyThread
对象,当threading.current_thread()
在一个新的greenlet中调用(这通常是隐式发生的,例如日志记录时),重量要轻得多。例如,它们不再分配,然后删除Semaphore
这对Pypy尤其重要。请求登录
gevent.pywsgi
在python 3上正确格式化状态代码。报告时间: issue #664 作者:陈凯文。恢复对
gevent.lock.Semaphore
作为制作的一部分被无意中移除Semaphore
1.1b1上Pypy上的原子。报告时间: issue #666 作者:朱依凡。为python 3.5构建Windows轮子。报告时间: pull request #665 用六角链钳。
1.1B5(2015年9月18日)#
gevent.subprocess
在python 3.5下工作。通常,Python3.5有初步的支持。报告时间: issue #653 发出吱吱声。Popen.communicate
荣誉Atimeout
参数,即使无法与子进程通信(stdin、stdout和stderr均未设置为PIPE
)。作为新函数的python 3.5测试套件的一部分被注意到subprocess.run
但影响所有版本 (timeout
是python 3下的官方参数,也是python 2下语义稍有不同的gevent扩展。修复一个可能的
ValueError
从Queue.peek
. 报告时间: issue #647 作者:陈凯文。恢复向后兼容性以便使用
gevent.signal
作为可调用项,根据进口顺序,可在添加gevent.signal
模块。报告时间: issue #648 西尔文·齐默。在python 2下对系统进行monkey修补后,在模块的顶层执行的gevent阻塞操作可能导致
LoopExit
而不是完成预期的阻塞操作。请注意,通常不建议在模块的顶层执行gevent阻塞操作,但当monkey修补现有脚本时,可能会出现这种情况。报告时间: issue #651 和 issue #652 作者:迈克·卡普林斯基。SIGCHLD
和waitpid
现在为(猴子补丁)返回的pids工作os.forkpty
和pty.fork
函数的作用方式与os.fork
功能。报告时间: issue #650 作者:Erich Heine。WSGIServer
和WSGIHandler
在start_response()
按照 WSGI specification . 此外,在python 2下,为了使应用程序一致,可以避免不必要的编码和编码(通常是通过ASCII编码进行的)。这是对已经记录并部分强制的约束的增强:从1.1a1开始,在python 2下,u'abc'
以前通常是允许的,但是u'\u1f4a3'
不会;现在,也不允许这样做,更接近规范,改进可调试性和性能,允许应用程序和gevent更好地处理错误(以前,某些编码错误可能导致gevent写入无效/格式错误的HTTP响应).由Greg Higgins和Carlos Sanchez报道。现在报告了测试的代码覆盖率 coveralls.io .
1.1B4(2015年9月4日)#
即使启用了python解释器优化,也会检测并引发几种重要编程错误类型的错误。
-O
或PYTHONOPTIMIZE
. 以前,如果启用了优化,就不会检测到这些问题,这可能导致不稳定、难以调试的行为。修复一个
AttributeError
从gevent.queue.Queue
什么时候?peek
在一个空的Queue
. 报告时间: issue #643 作者:Michaelvol。制作
SIGCHLD
指定给的处理程序gevent.signal.signal()
使用默认情况下使用的子观察程序。也制造gevent.os.waitpid()
使用-1的第一个参数。(也适用于相应的monkey-patched stdlib函数。)由gunicorn的用户指出。在python 2下,当使用
socket.makefile
. 报告时间: issue #644 卡兰·里昂。
1.1B3(2015年8月16日)#
修复一个
AttributeError
从gevent.monkey.patch_builtins
在python 2上 future 库也已安装。卡洛斯·桑切斯报道。Pypy:修复A
DistutilsModuleError
或ImportError
如果CFFI模块支持gevent.core
在初始化集线器时需要编译(由于丢失或无效__pycache__
目录)。现在,模块将在导入gevent时自动编译(这可能会在stdout上生成编译器输出)。报告时间: issue #619 通过Thinh Nguyen和 issue #631 安迪·弗里兰,杰伊·奥斯特和马特·杜普的贡献。Pypy:提高
gevent.socket.socket:sendall
输入量大。 bench_sendall.py 现在在Pypy上的性能和在Cpython上的性能差不多,提高了10倍(从~60MB/s到~630MB/s)。看看这个 pypy bug 有关详细信息。修复一个可能的
TypeError
打电话时gevent.socket.wait
. Lanstin在635年报告。gevent.socket.socket:sendto
正确地尊重套接字的阻塞状态(这意味着它现在可以在以前没有的情况下引发ewouldBlock)。报告时间: pull request #634 作者:迈克·卡普林斯基。使用的常见查找错误
threaded resolver
不再总是打印到stderr,因为它们通常超出程序员的控制范围并被显式捕获。(编程错误如TypeError
仍在打印。)报告 issue #617 作者:杰伊·奥斯特和卡洛斯·桑切斯。Pypy:修复A
TypeError
从gevent.idle()
. 报告时间: issue #639 由Chilun2008。这个
imap_unordered()
类池对象的方法支持maxsize
用于限制等待使用者的缓冲结果数的参数。报告时间: issue #638 西尔文·齐默。班级
gevent.queue.Queue
现在不断地命令多个阻塞等待put
和get
呼叫者按他们到达的顺序。以前,由于实现的奇怪,这通常在cpython下是大致如此,但在pypy下不是。现在他们的行为都一样了。班级
gevent.queue.Queue
现在支持len()
功能。
1.1B2(2015年8月5日)#
启用使用
c-ares resolver
在派比手下。请注意,它的性能特性可能是次优的。在某些平台(尤其是64位Linux上的2.6.0)上,启用
gevent.monkey.patch_builtins
可能导致Pypy崩溃。报告时间: issue #618 杰伊·奥斯特。gevent.kill()
在目标greenlet中引发正确的异常。报告时间: issue #623 作者:乔纳森·卡门斯。Windows上的各种修复程序。报告时间: issue #625 , issue #627 和 issue #628 作者:Jacekt和袁腾(Jeff)Pei。固定在 pull request #624 .
添加
readable()
和writable()
方法到FileObjectPosix
;这修复了在monkey修补时python 3上的help()。
1.1B1(2015年7月17日)#
setup.py
可以从包含空格的目录运行。报告时间: issue #319 伊万·斯米尔诺夫。setup.py
可以在OSX上使用clang的新版本进行构建。它们加强了cflags和cppflags之间的区别。gevent.lock.Semaphore
在Pypy上是原子的,就像在Cpyton上一样。这在Pypy上的性能成本很低。修复了未能设置
successful
在运行greenlet之前杀死它时,值为false,并带有非默认异常。固定在 pull request #608 作者:Heungsub Lee。利贝夫的儿童观察者
os.waitpid()
由于在POSIX平台上使用信号而变得不可靠。这在使用时尤其明显gevent.subprocess
与multiprocessing
. 现在,猴子修补了os
模块提供waitpid()
旨在改善这一状况的职能。报告时间: issue #600 由Champax和 issue #452 作者:Ukasz Kawczy_ski。在实现的平台上
select.poll
,提供一个Gevent友好型gevent.select.poll
以及相应的猴子补丁。实施于 pull request #604 埃迪·林德。允许将事件传递到pypy下的IO回调。报告时间: issue #531 作者:M.Nunberg,于 pull request #604 .
gevent.thread.allocate_lock()
(于是一个猴子修补的标准库allocate_lock()
)更接近于内置的行为:无法释放未锁定的锁,尝试这样做会引发正确的异常 (thread.error
在python 2上,RuntimeError
在python 3上)。以前,过度释放锁被静默地忽略。报告时间: issue #308 作者:J_Drzej Nowak。gevent.fileobject.FileObjectThread
使用threadpool关闭下划线文件类对象。报告时间: issue #201 作者:维塔利·克鲁格。恶意或格式错误的HTTP分块传输编码数据发送到
pywsgi handler
处理更为严格,导致“HTP400错误请求”响应,而不是500个错误,或者在最坏的情况下,服务器端挂起。报告时间: issue #229 作者:Bj_rn Lindqvist。导入标准库
threading
模块 之前 使用gevent.monkey.patch_all()
不再导致python 3.4无法获取repr
主线程和其他cpython平台返回一个不可行的dummathread。(注意,不建议这样做。)报告于 issue #153 .在python 2下,使用
io
要实现的包FileObjectPosix
. 这将代码与Python3实现统一,并解决了使用seek()
. 见 issue #151 .在python 2下,从多个greenlet中导入一个在顶层使用gevent阻塞函数的模块不再产生导入错误(python 3本机处理这种情况)。报告时间: issue #108 由Shaun和Sylvain Zimmer基于代码的初始修复。
gevent.spawn()
,spawn_raw()
和spawn_later()
以及Greenlet
构造器,立即产生有用的TypeErrors
如果要求运行无法运行的内容。在此之前,繁殖的绿叶小菜会在未被捕获的情况下死去。TypeError
第一次切换到。报告时间: issue #119 斯蒂芬。递归使用
ThreadPool.apply
不再提高LoopExit
错误(使用ThreadPool.spawn
然后get
结果仍然可以;您必须小心使用正确的集线器)。报告时间: issue #131 到5月8日。当
threading
模块是monkey-patched
,模块级锁定logging
模块被设置为greenlet-aware,任何配置的处理程序的实例锁也是如此。这使得导入使用创建模块级别的标准模式的模块更加安全。Logger
猴子修补前的实例。正在配置logging
使用基本配置,然后猴子修补也更安全(但不包括涉及SocketHandler
)修复猴子修补
threading.RLock
在python 3下。在python 3中,在由另一个模块导入的模块的顶层进行monkey修补可能会导致
RuntimeError
从importlib
. 报告时间: issue #615 作者:丹尼尔·米兹里基。(如果threading.RLock
是围绕着猴子打补丁的电话进行的;这不太可能,但用进口挂钩也不可能。)修复在64位平台上运行时为32位python配置C-ares的问题。报告时间: issue #381 固定在 pull request #616 克里斯·莱恩。附加修复 pull request #626 作者:陈凯文。
(实验)让
pywsgi.WSGIServer
接受logging.Logger
其实例log
和(新)error_log
参数。如果尝试这样做,请注意系统在进程生命周期的早期就完全进行了猴子补丁,并注意,尚未测试非文件处理程序。修正 issue #106 .
1.1a2(2015年7月8日)#
gevent.threadpool.ThreadPool.imap
和imap_unordered
现在接受多个iterables。(实验)使用
ThreadPool
或Group
映射/应用程序函数现在应该具有原始的回溯。gevent.threadpool.ThreadPool.apply()
now raises any exception raised by the called function, the same asGroup
/Pool
还有内置的apply()
功能。这会使没有证件的人apply_e
功能。原始pr issue #556 罗伯特·埃斯特尔。猴子修补
selectors
模块从patch_all
和patch_select
在python 3.4上。见 issue #591 .的附加查询函数
gevent.monkey
模块允许知道修补了什么。在中讨论 issue #135 并在 pull request #325 内森·霍德。在python 2.7.9或更高版本或python 3下的非monkey补丁环境中,使用gevent ssl套接字可能导致greenlet阻塞。见 issue #597 大卫·福特。
gevent.socket.socket.sendall()
支持实现缓冲区协议的任意对象(如CTypes结构),就像本机套接字一样。报告时间: issue #466 作者:Tzickel。增加了对
onerror
cffi 1.2.0中存在的属性用于在pypy下更好地处理信号。感谢Armin Rigo和Omer Katz。(请参阅https://bitback.org/cffi/cffi/issue/152/handling-errors-from-signal-handlers-in)这个
gevent.subprocess
模块的行为更接近于Python3下的标准库,至少在POSIX上是如此。这个pass_fds
,restore_signals
和start_new_session
现在实现了参数,正如timeout
各种功能的参数。在python 2下,以前未记录的timeout
参数到Popen.communicate
引发一个类似于其python 3对应的异常。用启动子进程的异常
gevent.subprocess
模块不再泄漏文件描述符。报告时间: pull request #374 陈小玉。这个例子
echoserver.py
不再绑定到标准x11 TCP端口。报告时间: issue #485 以分钟为单位。gevent.iwait()
不再投掷LoopExit
如果调用者在返回值之间切换greenlet。报告和初始补丁 issue #467 作者:亚历克赛·博岑科夫。默认的threadpool和默认的线程分解器在分叉的子进程中工作,例如
multiprocessing.Process
. 以前,子进程将无限期挂起。报告时间: issue #230 作者:LX Yu。fork观察程序更可能(最终)在多线程程序中被调用(在Windows上除外)。见 issue #154 .
gevent.killall()
接受一个任意不可杀死的绿小子。报告时间: issue #404 由Martin Bachwerk编写;与旧版本的简单请求结合使用。gevent.local.local
对象现在可以在greenlet运行完成后立即进行垃圾收集,以匹配内置的行为threading.local
(本机实现时)。报告时间: issue #387 由Ausiv提供。杀了一个格林莱特
gevent.kill()
或gevent.Greenlet.kill()
)在它实际启动并切换到now之前,将阻止greenlet运行,而不是在稍后切换到时引发异常。见 issue #330 乔纳森卡门斯报道。
1.1A1(2015年6月29日)#
添加对python 3.3和3.4的支持。许多人为此作出了贡献,包括但不限于Fantix King、Hashstat、Elizabeth Myers、Jander、Luke Woydziak等。见 issue #38 .
添加对pypy的支持。见 issue #248 . 请注意,为了获得最佳效果,您需要一个非常新的Pypy构建,包括CFFI 1.2.0。
放下对python 2.5的支持。python 2.5用户可以继续使用gevent 1.0.x。
固定
gevent.joinall()
不忽略count
什么时候?raise_error
是假的。见 pull request #512 伊万·迪奥。固定
gevent.subprocess.Popen
不要忽视bufsize
参数。请注意,这会更改(依赖于平台的)默认值,通常从Buffered更改为UnBuffered。见 pull request #542 罗穆拉德·布鲁内。将C-ARES升级到1.10.0。见 pull request #579 作者:奥马尔·卡茨。
小心
C战神
configure
脚本现在对环境变量(如CFLAGS
和LDFLAGS
它们可能需要修改(例如,CFLAGS
不再允许包含-I
指令,必须放在CPPFLAGS
)添加
count
参数gevent.iwait()
. 见 pull request #482 作者:Wiggin15。添加
timeout
参数gevent.queue.JoinableQueue.join()
现在返回是否等待所有项目。gevent.queue.JoinableQueue
对待items
传递给__init__
就像未完成的任务一样put
. 首字母 pull request #554 杜尔松。gevent.pywsgi
不再为过早断开客户端连接的正常情况打印调试信息。见 issue #136 ,固定在 pull request #377 保罗·科利尔。(实验性的)等待或从提出异常的greenlet获得结果现在通常会引发原始的回溯。这应该有助于像哨兵这样的人跟踪最初的问题。见 issue #450 和 issue #528 由Rodolfo和Eddi Linder和 issue #240 埃里克·艾里克。
升级至libev 4.20。见 pull request #590 作者:Peter Renstr_m.
固定
gevent.baseserver.BaseServer
当其handle
函数本身就是一个InstanceMethod。见 pull request #501 乔·杰夫尼克。使
acquire
方法gevent.lock.DummySemaphore
始终返回true,将其用例支持为“无限”或无限信号量,不提供排除,并允许使用if sem.acquire(): ...
. 见 pull request #544 作者:穆阿德·本奇奥伊。补丁
subprocess
默认在gevent.monkey.patch_all
. 见 issue #446 .gevent.pool.Group.imap
和imap_unordered
现在接受多个iterables,比如itertools.imap
. issue #565 托马斯·斯坦纳报道。兼容性说明 :
gevent.baseserver.BaseServer
及其子类gevent.server.StreamServer
现在,当请求处理程序返回时,确定地关闭客户机套接字。以前,套接字是留给垃圾收集器的;在cpython 2.x下,这意味着当最后一个引用消失时,这通常是,但不一定是,当请求处理程序返回时,但在pypypy下,它是将来的某个任意点,在cpython 3.x下是一个资源。无法生成CEWarning。这是未记录的行为,在请求处理程序意外或故意返回之后,客户机套接字可以保持打开状态。兼容性说明 :
pywsgi
现在确保头可以用拉丁语1(ISO-8859-1)编码。这提高了对HTTP标准的遵从性(并且在Python3下是必需的)。在某些情况下,以前的版本可能允许发送非ISO-8859-1头文件,但不知道合格接收者对这些文件的解释;现在,将引发一个单代码错误。见 issue #614 .