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)); 
     } 
    } 

Le fichier word2vectors.wordsNearest() est une méthode issue d'une bibliothèque publique. J'ai l'intention de laisser 4 threads exécuter simultanément la méthode pour accélérer le processus. Ce fil est-il sûr?Est-ce que ce morceau de code est sûr?

+2

Dépend de la méthode 'wordsNearest'. – Oleg

+0

Si je ne peux pas contrôler les mots, comment puis-je sécuriser ce code? – user697911

+1

Sans rien connaître d'autre, le seul moyen sûr est d'utiliser un thread ou de synchroniser sur 'word2vectors' quand vous appelez' wordsNearest'. – Oleg

Répondre

2

Votre extrait de code sera thread-safe si les conditions suivantes sont réunies:

  1. L'appel word2vectors.wordsNearest(...) est thread-safe
  2. La structure de données word2vectors est créé et initialisé par le thread courant.
  3. Rien ne modifie la structure de données entre l'appel pools.execute et la fin du calcul.

Si wordsNearest ne regarde pas les autres structures de données, et si elle ne change pas la structure de données word2vectors, il est une hypothèse raisonnable qu'il est thread-safe. Cependant, la seule façon d'être sûr est de l'analyser.

Mais il est également important de noter que vous ne soumettez qu'une seule tâche à l'exécuteur. Étant donné que chaque tâche doit être exécutée par un seul thread, votre code utilise effectivement un seul thread. Pour exploiter le multithreading, vous devez diviser votre tâche unique en plusieurs tâches petites et indépendantes; par exemple. mettre la boucle de répétitions de 10 000 en dehors de l'appel d'exécution ...

+0

pouvez-vous prendre cela comme un exemple et le diviser en plusieurs petites tâches? – user697911

+0

Je vous ai déjà dit une façon de le faire. Lisez ma réponse à nouveau. –

+0

J'ai mis à jour mon code avec votre suggestion. Cela semble fonctionner de manière imprévisible. Supposons que je n'ai aucun contrôle sur word2vectors.wordsNearest, comment puis-je sécuriser cette méthode? – user697911