我已经使用SocketServer模块来创建一个小型服务器。它主要工作,但我有一个关于多个客户端同时accesing服务器的一些问题:Python socketserver - 与threading.Lock()交互?
当使用绝对基本的TCP SocketServer的,即没有ThreadingMixin或ForkingMixin - 当第二个客户端试图连接到服务器上发生了什么在它完成为第一个客户提供服务之前;第二个连接会被删除吗?或者第二个客户端会阻止?
我尝试添加ThreadingMixin。在这种情况下,我需要保护的服务器代码的某一代码块与锁
lock = threading.Lock() with lock: # Do stuff here ... # ... # Continue in unlocked scope.
但锁好像忽略了 - 整个事情崩溃。而不是与我也尝试使用lock.aquire()& lock.release() - 那么它似乎无条件地封锁lock.aquire()。所以对我来说,似乎ThreadingMixin不会很好地与threading.Lock()一起玩。
编辑:丹关于使用相同的锁的评论可能是我的锁定问题的关键;我目前的处理程序代码如下所示:
class MyThreadedHandler(SocketServer.BaseRequestHandler):
def handle(self):
lock = threading.Lock() <-- Each thread a separate lock?!
with lock:
# Do serial stuff
# Continue parallell processing.
所以 - 我想每个线程将锁定它的个人锁 - 不是非常多一点!
对于问题#2,您能向我们展示一个我们可以运行的小例子来证明您看到的问题吗?创建自己的锁定和锁定应该没有问题 - 不应该被忽略,也不应该让程序崩溃。 (通过崩溃,你的意思是有例外吗?)除非你正在做一些特殊的需要'acquire()'或'release()'的东西,否则坚持用'lock'。不要忘记锁定相同的锁(不是由同一行代码创建的两个或多个不同的锁!) – 2014-11-21 16:35:53