Ho un file di testo di ~ 600 blocchi IP di notazione CIDR che, quando espanso, ammonta a ~ 17.5 M indirizzi IP. Devo collegarmi connettere a ciascuno. Se si collega, lo aggiungo a un elenco "live", se restituisce un errore / rifiuto, a un elenco "morto". Quindi la presa è chiusa. Non ho bisogno di leggerlo, non ho bisogno di scriverlo. Ovviamente, questo è un problema di scala, se assumiamo generosamente che la connessione richiede solo un secondo per restituire il successo o il fallimento, ci vorrebbero mesi per il completamento, ma probabilmente diversi anni. Devo ridurlo a < 24 ore.
In questo momento sto usando Python per espandere / contare ciascuno degli indirizzi IP, perché è banale farlo. Sto scrivendo un semplice programma C multi-thread per risolvere il problema precedente. Ci sono alcuni modi in cui ho pensato di affrontare questo:
-
Uso puramente C: non ho trovato un modo per espandere un blocco CIDR in C, (gestire le stringhe in generale è un dolore). Probabilmente potrei cucinare qualcosa, ma se qualcosa esiste già mi piacerebbe sentirne parlare. Sarò in grado di generare abbastanza thread? Anche se depongo un thread per ogni blocco, quei 600 thread! Mi sento come se avessi bisogno di ridurre lo spazio di stack assegnato ai thread per fare questo forse? Anche così, devo essere in grado di gestire un numero elevato di stringhe perché i blocchi devono essere espansi. Indipendentemente da ciò, ho esaminato la lista a mano, e uno dei blocchi ha una notazione CIDR / 10, che ammonta a > IP 4M da solo. Ciò richiederebbe ancora troppo tempo.
-
Generazione di processi C da Python: questo banalizza il problema delle stringhe e ogni singolo IP può essere inviato a un'istanza di una funzione C chiamata da Python, che quindi terminerebbe. La domanda che ho è: quando Python chiama una funzione C esterna, continua a funzionare con il processo C in parallelo? O aspetta che la funzione C si completi? So che Python non consente il multi-threading (o meglio, lo fa, ma è un po 'uno scherzo dal momento che solo una riga viene interpretata alla volta), quindi questo è il modo corretto di "esportare" multi-threading?
-
Viceversa: come sopra, ma con C che chiama il codice Python, questo "di più" è corretto? In altre parole, C può avviare più processi Python e continuare a farlo da solo?
-
Qualcosa di completamente diverso.
Qualsiasi domanda, suggerimento o dubbio sono ben accetti. Si prega di indicare qualsiasi cosa potrei essere mancante o ipotesi errate che ho fatto.
Grazie per il tuo aiuto.