отличная многопоточность - PullRequest
3 голосов
/ 06 апреля 2010

Я новичок в Groovy / Grails.

Как реализовать поток для этого кода. Было 2500 URL, и это занимало часы времени для проверки каждого URL.

поэтому я решил реализовать многопоточность для этого:

Вот мой пример кода:

def urls = [
  "http://www.wordpress.com",
  "http://67.192.103.225/QRA.Public/" ,
  "http://www.subaru.com",
  "http://baldwinfilter.com/products/start.html"
]

def up = urls.collect { ur ->
    try {
        def url = new URL(ur)
        def connection = url.openConnection()
        if (connection.responseCode == 200) {
            return true
        } else {
            return false
        }
    } catch (Exception e) {
        return false
    } 
}

Для этого кода мне нужно реализовать многопоточность .
Может ли кто-нибудь предложить мне код.

спасибо заранее,
шри.

Ответы [ 5 ]

11 голосов
/ 06 апреля 2010

Я бы взглянул на библиотеку Groovy Parallel Systems . В частности, я думаю, что раздел Параллельные коллекции был бы полезен.

Глядя на документы, я полагаю, что collectParallel является прямой заменой для сбора (учитывая очевидные предостережения относительно побочных эффектов). У меня отлично работает следующее:

def urls = [
  "http://www.wordpress.com",
  "http://www.subaru.com",
  "http://baldwinfilter.com/products/start.html"
]
Parallelizer.doParallel {
    def up = urls.collectParallel { ur ->
        try {
            def url = new URL(ur)
            def connection = url.openConnection()
            if (connection.responseCode == 200) {
                return true
            } else {
                return false
            }
        } catch (Exception e) {
            return false
        }
    }
    println up
}
3 голосов
/ 06 апреля 2010

В Groovy docs приведен пример использования ExecutorService для выполнения ваших задач.

1 голос
/ 05 апреля 2014

Я думаю, что этот способ очень прост для достижения.


import java.util.concurrent.*

//Thread number
THREADS = 100
pool = Executors.newFixedThreadPool(THREADS)
defer = { c -> pool.submit(c as Callable) }

def urls = [
  "http://www.wordpress.com",
  "http://www.subaru.com",
]

def getUrl = { url ->
  def connection = url.openConnection()
  if (connection.responseCode == 200) {
    return true
  } else {
    return false
  }
}


def up = urls.collect { ur ->
    try {
        def url = new URL(ur)
    defer{ getUrl(url) }.get()
    } catch (Exception e) {
        return false
    } 
}

println up
pool.shutdown()
1 голос
/ 06 апреля 2010

Вы можете использовать это для проверки URL в отдельной теме.

class URLReader implements Runnable
{
    def valid
    def url

    URLReader( url ) {
        this.url = url
    }

    void run() {
        try {
            def connection = url.toURL().openConnection()
            valid = ( connection.responseCode == 200 ) as Boolean
        } catch ( Exception e ) {
            println e.message
            valid = Boolean.FALSE
        }
    }
}
def reader = new URLReader( "http://www.google.com" )
new Thread( reader ).start()
while ( reader.valid == null )
{
    Thread.sleep( 500 )
}
println "valid: ${reader.valid}"

Примечания. Допустимым атрибутом будет null, Boolean.TRUE или Boolean.FALSE. Вам нужно будет немного подождать, чтобы все потоки могли открыть соединение. В зависимости от количества проверяемых URL-адресов, вы в конечном итоге достигнете предела количества потоков / соединений, которые вы можете реально обработать, поэтому следует проверять URL-адреса партиями соответствующего размера.

0 голосов
/ 07 апреля 2010

Вот как я реализовал:

class ValidateLinks extends Thread{
    def valid
    def url

    ValidateLinks( url ) {
        this.url = url
    }

    void run() {
        try {
            def connection = url.toURL().openConnection()
        connection.setConnectTimeout(5000)
            valid = ( connection.responseCode == 200 ) as Boolean
        } catch ( Exception e ) {
            println url + "-" + e.message
            valid = Boolean.FALSE
        }
    }
}

def threads = [];
urls.each { ur ->
def reader = new ValidateLinks(ur.site_url)
reader.start()
threads.add(reader);
}

while (threads.size() > 0) {

        for(int i =0; i < threads.size();i++) {
                def tr = threads.get(i);
                if (!tr.isAlive()) {
                        println "URL : " + tr.url  + "Valid " + tr.valid
                        threads.remove(i);
                        i--;

                }
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...