2016-03-11 1 views
0

Я пишу программу, которая в 3AM, она читает все из файла и загружает файлы из ссылок один за другим и перестает делать это (паузы загрузка), если это 7AMОстановка потока без цикла (функция, которая занимает много времени)

Но моя проблема в том, что если я использую os.system("wget name"), я не смогу остановить его, я не могу поставить флаг в цикле while, чтобы проверить его, потому что os.system() не закончится до тех пор, пока загрузка завершена. Я не могу думать иначе. Моя сеть нестабильна, поэтому я предполагаю, что мне нужно использовать wget, я слышал о urllib, но я не уверен, что она будет работать с моим нестабильным соединением!

Я планирую продолжить это на ArchLinux на моем Raspberry Pi

+1

использовать 'handle = subprocess.Popen (['wget', 'name'])' вместо этого. Функция 'handle' имеет функцию' .poll() 'для проверки состояния и' .terminate() 'для завершения процесса. Также есть 'send_signal (SIGNAL)', но все это опасно, если не сделано правильно. – Torxed

+1

И тогда убитый подпроцесс все еще работает в фоновом режиме? Думаю, ему нужно что-то вроде группы процессов, описанной здесь: http://stackoverflow.com/questions/4789837/how-to-terminate-a-python-subprocess-launched-with-shell-true –

+0

Спасибо большое! что будет работать, я думаю, уже слишком поздно я напишу код tomarrow! – user3033693

ответ

1

У вас есть подпроцесс вы хотите остановиться в 7 часов утра. Popen.wait имеет таймаут, поэтому все, что вам нужно сделать, это выяснить тайм-аут и использовать его.

import subprocess 
import datetime 
import time 

now = datetime.datetime.now() 
stopat = now.replace(hour=7, minute=0, second=0, microsecond=0) 
delta = stopat.timestamp() - now.timestamp() 
if delta > 0: 
    proc = subprocess.Popen("wget name", shell=True) 
    try: 
     proc.wait(delta) 
    except subprocess.TimeoutExpired: 
     proc.terminate() 
     try: 
      proc.wait(2) 
     except subprocess.TimeoutExpired: 
      proc.kill()