gpt4 book ai didi

python:socket.sendall() 占用了 GIL?

转载 作者:行者123 更新时间:2023-11-30 22:49:44 25 4
gpt4 key购买 nike

我有一个多线程程序(大约 20 个线程;生产者/消费者与许多队列的混合)

在其中一个线程中,它从队列中弹出字符串并将其发送到远程程序

# it starts the thread like this
workQ = Queue.Queue()
stop_thr_event = threading.Event()
t = threading.Thread( target=worker, args=(stop_thr_event,) )


# in the thread's worker function
def worker(stop_event):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (myhost, int(myport))
sock.connect(server_address)
while True:
try:
item = workQ.get(timeout=1)

if print_only:
print item
else:
if item.startswith("key:"):
item = "{%s}" % item
sock.sendall(item)

workQ.task_done()
except Queue.Empty, msg:
if stop_event.isSet():
break

间歇性地,我的程序会挂起,没有线程在做任何工作

经过反复试验,我发现我的程序仅在该线程运行时挂起

我唯一的猜测是 sendall() 占用了 GIL 并且我的整个程序挂起

1)这是一个合理的理论吗?
2)如果我的理论是正确的,我该怎么做才能让 sendall() 不占用 GIL?使其成为非阻塞发送?

最佳答案

你错了。没有网络事件持有 GIL,sendall() 也不异常(exception)!

item=workQ.get()
socket.sendall() **# may take long time here.**
workQ.task_done()

因为sendall()可能需要很长时间,而其他使用workQ的线程在你调用task_done()之前不能轮流运行==>这就是为什么看起来你的整个程序都在挂起。

关于python:socket.sendall() 占用了 GIL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39630326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com