2017-10-07 6 views
-2
private static final Word2Vec word2vectors = getWordVector(); 

    private static Word2Vec getWordVector() { 
     String PATH; 
     try { 
      PATH = new ClassPathResource("models/word2vec_model").getFile().getAbsolutePath(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     log.warn("Loading model..."); 
     return WordVectorSerializer.readWord2VecModel(new File(PATH)); 
    } 

     ExecutorService pools = Executors.newFixedThreadPool(4); 
     long startTime = System.currentTimeMillis(); 
     List<Future<?>> runnables = new ArrayList<>(); 
     if (word2vectors != null) { 
      for (int i = 0; i < 3000; i++) { 
       MyRunnable runnable = new MyRunnable("beautiful", i); 
       runnables.add(pools.submit(runnable)); 
      } 
     } 
     for(Future<?> task: runnables){ 
      try { 
       task.get(); 
      }catch(InterruptedException ie){ 
       ie.printStackTrace(); 
      }catch(ExecutionException ee){ 
       ee.printStackTrace(); 
      } 
     } 
     pools.shutdown(); 

static class MyRunnable implements Runnable{ 
     private String word; 
     private int count; 
     public MyRunnable(String word, int i){ 
      this.word = word; 
      this.count = i; 
     } 

     @Override 
     public void run() { 
       Collection<String> words = word2vectors.wordsNearest(word, 5); 
       log.info("Top 5 cloest words: " + words); 
       log.info(String.valueOf(count)); 
     } 
    } 

Das Wort2vectors.wordsNearest() ist eine Methode aus einer öffentlichen Bibliothek. Ich beabsichtige, 4 Threads gleichzeitig auszuführen, um den Prozess zu beschleunigen. Ist dieser Thread sicher?Ist dieses Stück Code sicher?

+2

Hängt von der Methode 'wordsNearest' ab. – Oleg

+0

Wenn ich Wörter nicht kontrollieren kann, am nächsten, wie kann ich diesen Code sicher machen? – user697911

+1

Ohne etwas anderes zu wissen, ist der einzige sichere Weg, einen Thread zu verwenden oder auf 'word2vectors 'zu synchronisieren, wenn Sie' wordsNearest' aufrufen. – Oleg

Antwort

2

Ihr Code-Snippet wird Thread-sicher, wenn folgende Bedingungen erfüllt sind:

  1. Der word2vectors.wordsNearest(...) Anruf ist thread-safe
  2. Die word2vectors Datenstruktur erzeugt wird und durch den aktuellen Thread initialisiert.
  3. Nichts ändert die Datenstruktur zwischen dem Aufruf pools.execute und der Beendigung der Berechnung.

Wenn wordsNearest schaut nicht auf andere Datenstrukturen, und wenn es nicht die word2vectors Datenstruktur nicht ändert, dann ist es eine vernünftige Annahme , dass es Thread-sicher ist. Der einzige Weg, um sicher zu sein, ist jedoch analysieren.

Aber es ist auch erwähnenswert, dass Sie nur eine einzige Aufgabe an den Executor übergeben. Da jede Aufgabe von einem einzelnen Thread ausgeführt wird, verwendet Ihr Code effektiv nur einen Thread. Um Multi-Threading auszunutzen, müssen Sie Ihre einzelne große Aufgabe in mehrere kleine und unabhängige Aufgaben aufteilen; z.B. Setzen Sie die Schleife mit 10.000 Wiederholungen außerhalb des Ausführungsaufrufs ...

+0

Kannst du das als ein Beispiel nehmen und es in mehrere kleine Aufgaben aufteilen? – user697911

+0

Ich habe dir schon einen Weg gesagt, es zu tun. Lies meine Antwort noch einmal. –

+0

Ich habe meinen Code mit Ihrem Vorschlag aktualisiert. Es scheint unsicher zu funktionieren. Angenommen, ich habe keine Kontrolle über word2vectors.wordsNearest, wie kann ich diese Methode Thread sicher machen? – user697911

Verwandte Themen