Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 20, 2009 12:56:06

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

запуск программы без ожидания её завершения

проблемма такая:

подключается клиент - запускаю программу через Popen
далее сразу выводится “start ok” и “close socket” - т.е. не ждет завершения запущенной программы,
НО! отключение клиента не происходит, клиент висит на связи до тех пор пока запущенная программа не отработает,
после завершения запущенной программы происходит разрыв соединения

нужно что-б отключение клиента было сразу после запуска приложения.
как быть?

# ... создаю сервер
conn, addr = sock.accept() # подключение клиента

import subprocess
subprocess.Popen(["ping","yanedex.ru"]) # запуск программы
print 'start ok'
conn.send('ok')
conn.close() # команда отключения от клиента
print 'close socket'
Python26 Win
перебрал разные ф-ии ничего не помогло, пока вижу один выход - потоки

Отредактировано (Авг. 20, 2009 12:56:58)

Офлайн

#2 Авг. 20, 2009 17:50:58

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

запуск программы без ожидания её завершения

пока решения нет, выкрутился тем что закрываю соединение до запуска приложения :)

Офлайн

#3 Авг. 21, 2009 12:15:35

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

запуск программы без ожидания её завершения

Смотри os.fork + os.exec* или os.spawn* в винде



Офлайн

#4 Авг. 25, 2009 11:52:51

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

запуск программы без ожидания её завершения

slivlen
Смотри os.fork + os.exec* или os.spawn* в винде
os.spawn не помогает

исходники:
сервер
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys
import socket

g_ServLoop = 1

def toexec2():
import subprocess
subprocess.Popen('ping 127.0.0.1 -n 7', shell = True)
def toexec():
os.spawnv(os.P_NOWAIT,'c:\\windows\\system32\\ping.exe',['ping.exe','127.0.0.1','-n','7'])

try:
g_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
g_sock.bind(('', 11111))
g_sock.listen(10)
start = 1
except:
print u"Error start"
if start:
print u'Started ok'
while g_ServLoop:
conn, addr = g_sock.accept()
print addr
data = conn.recv(4096)
toexec()
conn.send('ok')
conn.close()
клиент
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys
import socket
import time

print time.ctime()
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 11111))
s.send('common')
# recv data
data = ''
while 1:
buf = s.recv(16384)
if not len(buf):
break
data += buf
print data
except:
print 'Error socket'
print time.ctime()

Офлайн

#5 Сен. 12, 2009 19:53:43

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

запуск программы без ожидания её завершения

poltergeist
Это всё-таки не баг, а фича. Причём не питона, а вообще. Попробую описать что происходит:
Если не запускать дочерний процесс, то соединение как надо разрывается и клиент благополучно выходит из цикла приёма данных получив свой законный “len(buf) == 0”, означающий разрыв соединения. При создании дочернего процесса ресурсы родительского процесса (все дескрипторы в юниксах, кроме 0, 1, 2, и все хэндлеры в винде) наследуются в дочернем процессе, поэтому сокет и не закрывается, пока дочерний процесс не умрёт или не освободит занятый ресурс. Чтобы всё работало как задумывалось, надо в subprocess.Popen передать дополнительный параметр close_fds=True.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version