Página 1 de 1

Descargar 100 archivos simultaneamente...

Publicado: 19 Mar 2017, 22:11
por kemazonico
¿Hay manera de descargar simultaneamente una gran cantidad de archivos (unos 100) de aprox 4096 bytes y que no tarde tanto tiempo?, he intentado descargarlos de manera "normal" (uno a la vez) pero el tiempo de descarga de unos 10 archivos no es muy corto. ya que el servidor no responde tan rapido, tambien he intentado descargarlos todos simultaneamente (como se muestra en el código) pensando que seria más rapido y si, en efecto es mucho más rapido y he podido descargar unos 50 archivos en apenas 25 segundos...

Sin embargo, como se daran cuenta estoy usando una pausa de 25 segundos al final del loop para darle tiempo a que todos los archivos se descarguen y como requiero optimizar al máximo el tiempo consumido desconozco como corroborar si los archivos ya se han descargado antes del tiempo previsto y no tener que depender de la suerte.

Otra duda que tengo es como ponerle un "timeout" a la descarga y que por ejemplo si un archivo sobrepasa cierto tiempo en poder conectar, omita este y continue con el resto, ya saben, por cuestiones de reducir los tiempos.

Espero me puedan orientar, quiza estoy usando un metodo incorrecto.


Código: Seleccionar todo

$canArray = IniReadSectionNames("C:\xampp\htdocs\iptv\canales.ini") ;;; Este ini contiene el listado de los 100 archivos cada uno contendra 3 distintos links por si uno falla

    If Not @error Then

        For $can = 1 To $canArray[0]

		$urlArray = IniReadSection ("C:\xampp\htdocs\iptv\canales.ini", $canArray[$can] )

		$url1 = IniRead ("C:\xampp\htdocs\iptv\canales.ini", $canArray[$can], "URL1", "")
		ConsoleWrite ($url1 & @CRLF)

		InetGet ($url1, "C:\xampp\htdocs\iptv\" & $canArray[$can] & "_tmp.m3u8", 1, 1)

		Sleep(500)
        Next

		Sleep (25000) ;; Esta es la pausa, sin embargo esto no me es muy funcional..

    EndIf

Re: Descargar 100 archivos simultaneamente...

Publicado: 23 Mar 2017, 06:49
por Dany
Hola. Puedes hacer algo asi para dercargar simultaneamente varios archivos.

Código: Seleccionar todo

#include <InetConstants.au3>


Local Const $sDownloadFolder = @ScriptDir & '\Download\'
DirRemove($sDownloadFolder)
DirCreate($sDownloadFolder)

Local Const $sDownloadUrl = 'https://upload.wikimedia.org/wikipedia/commons/3/39/50_fenig%C3%B3w_ubt.jpeg'


Local $aDownload[40]
For $i = 0 To UBound($aDownload) - 1
	$aDownload[$i] = InetGet($sDownloadUrl, $sDownloadFolder & "Image-" & String($i + 1) & ".jpeg", $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
Next

Local $iDownloadOKs = 0
Local $iError = False
Local $iCompleted = False
While Sleep(30)

	For $i = 0 To UBound($aDownload) - 1
		$iCompleted = InetGetInfo($aDownload[$i], $INET_DOWNLOADCOMPLETE)
		$iError = InetGetInfo($aDownload[$i], $INET_DOWNLOADERROR)
		If $iCompleted Then
			ConsoleWrite("+Download OK. File: " & "Image-" & String($i + 1) & ".jpeg" & @CRLF)
			InetClose($aDownload[$i])
			$iDownloadOKs += 1
		EndIf

		If $iError Then
			ConsoleWrite("!Download FAIL. File: " & "Image-" & String($i + 1) & ".jpeg" & @CRLF)
			InetClose($aDownload[$i])
			$iDownloadOKs += 1
		EndIf

	Next
	If $iDownloadOKs = UBound($aDownload) Then ExitLoop
WEnd

ConsoleWrite("+Donwloads Finished..." & @CRLF)





Saludos :smt027

Re: Descargar 100 archivos simultaneamente...

Publicado: 29 Mar 2017, 00:57
por kemazonico
Muchas gracias por la ayuda, me sirvio muho..
Lamentablemente decidi cambiar de estrategia ya que aún con este ultimo metodo la descarga es tardada ya que el servidor genera esos archivos via PHP y no esta optimizado para poder servir tantas peticiones, sin embargo tu metodo me sirve para otros propósitos.

Gracias!!