并发的未来对象永远阻塞



我试图从David Beazley的演讲中理解并发性。但是当执行服务器和客户端并尝试从客户端提交数字20时,似乎future对象在调用future .result()时永远阻塞。我不明白为什么:

# server.py
# Fib microservice
from socket import *
from fib import fib
from threading import Thread
from concurrent.futures import ProcessPoolExecutor as Pool
pool = Pool(4)
def fib_server(address):
sock = socket(AF_INET, SOCK_STREAM)
sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
sock.bind(address)
sock.listen(5)
while True:
client, addr = sock.accept()
print("Connection", addr)
Thread(target=fib_handler, args=(client,), daemon=True).start()
def fib_handler(client):
while True:
req = client.recv(100)
if not req:
break
n = int(req)
future = pool.submit(fib, n)
#Next line will block!!!!
result = future.result()
resp = str(result).encode('ascii') + b'n'
client.send(resp)
print("Closed")
fib_server(('',25000))
#client.py
import socket
s = socket.socket()
s.connect(('localhost',25000))
while True:
num=input("number?")
s.send(str(num).encode('ascii') + b'n')
res = s.recv(1000)
print('res:',res)

server>python server.py

client>python client.py

我们按顺序看:

server>连接('127.0.0.1',57876)

client>号码吗?20

server>(冻结)

最后这篇文章帮我解决了这个问题:所有的例子都是并发的。期货代码失败,提示"brokenprocesspoool"。

"在Windows下,当使用processpoolexecutor或任何其他生成新进程的并行代码时,保护代码的主循环以避免递归生成子进程是很重要的。

基本上,所有创建新进程的代码都必须在名称下。主要= = ',出于同样的原因,你不能在解释器中执行它。"

最新更新