я быть_наст многопоточная программа (около 20 нитей, смесь производителя/потребителей со многими очередями)python: socket.sendall() hogs GIL?
в одном из потоков, он выскакивает строку из очереди и отправить его на удаленную программу
# 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
с перерывами, моя программа будет просто повесить, ни один из потоков не делают любую работу
после проб и ошибок, я обнаружил, что моя программа зависает только с этой нитью
моих только догадывались s - то, что sendall() забивает GIL, и вся моя программа зависает
1) это даже правдоподобная теория?
2) если моя теория верна, что я могу сделать так, чтобы sendall() не свивал GIL? сделать его неблокированной отправкой?
if i dont ctrl c, он просто запустится вечно, поэтому я не знаю, что вы подразумеваете под sendall(), просто занимает много времени. если это займет много времени, разве это не закончилось бы, а не повесить? – ealeon
можно ли отправитьall(), чтобы его повесили? – ealeon
например, если клиент, который получает sendall(), не получает, отменяет ли sendall()? – ealeon