Leiningen Uberjar "пустой" время выполнения - PullRequest
6 голосов
/ 24 августа 2011

После создания uberjar с leiningen и запуска jar с java -jar foo-uberjar.jar программа работает нормально, и последняя строка кода выполняется довольно быстро, но программа зависает примерно на одну минуту, прежде чем завершить работу. В чем причина этого?

(ns redditwallpaper.core
  (:gen-class)
  (:require [clojure.contrib.duck-streams :as duck]
            [clojure.java [io :as io] [shell :as shell]]
            [clojure.string :as string]
            [clojure.contrib.json :as json])
  (:import (java.util Random)))

(defn filename [uri]
  (last (string/split uri #"/")))
(defn over_18 [x]
  (:over_18 x))
(defn posts [x]
  (map :data (get-in x [:data :children])))
(defn plain-image [x]
  (re-find #"(.jpg|.png)$" (:url x)))
(def url "http://www.reddit.com/r/wallpaper.json")
(def wallpaperjson (json/read-json (slurp url)))
(defn copy [uri fname]
  (with-open [in (io/input-stream uri)
              out (io/output-stream fname)]
    (.write out (duck/to-byte-array in))))
(defn randrange [n]
  (.nextInt (Random.) n))
(defn randitem [xs]
  (let [n (count xs)]
    (nth xs (randrange n))))
(defn set-background [file]
  (shell/sh "feh" "--bg-scale" file))
(defn -main [& args]
  (let [posts (posts wallpaperjson)
        safe (filter (complement over_18) posts)
        images (filter plain-image safe)
        image (:url (randitem images))
        fname (filename image)]
    (do
      (println (format "Downloading '%s'" image))
      (copy image fname)
      (println (format "Setting background image to '%s'" fname))
      (set-background fname)
      (println "Done"))))

java -jar redditwallpaper-0.0.1-standalone.jar 2.71s user 0.34s system 4% cpu 1:03.15 total

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

Попробуйте добавить,

(shutdown-agents)

когда вы будете готовы выйти.

1 голос
/ 18 августа 2012

В своих экспериментах с взаимодействием bash / clojure я заметил, что лучшим способом может быть использование плагина lein-exec по нескольким причинам.

Во-первых, у меня пока хорошо получается.

Я также выполнил несколько команд времени из bash, чтобы почувствовать разницу между моей первоначальной идеей - которая в основном заключалась в создании шаблона lein для скриптов - с одной стороны, и lein-exec с другой.

С одной стороны, мой эксперимент. Я еще не сделал шаблон lein, но идея была в следующем:

(ns closcrite.core
  (:require [clojure.java.shell :as shell])
  (:gen-class))

(defn -main
  "I don't do a whole lot."
  [& args]
  (let [shell-output (apply shell/sh args)]
    (println (shell-output :out))
    (shutdown-agents)))

Sexpr (shutdown-agents) просто потому, что я столкнулся с этой проблемой. Без (shutdown-agents):

lein compile && lein uberjar 
  && time java -jar target/closcrite-0.1.0-SNAPSHOT-standalone.jar "ls" "-ahl"
Compiling closcrite.core
Compilation succeeded.
All namespaces already :aot compiled.
Created /home/j/Development/closcrite/target/closcrite-0.1.0-SNAPSHOT.jar
Including closcrite-0.1.0-SNAPSHOT.jar
Including clojure-1.4.0.jar
Created /home/j/Development/closcrite/target/closcrite-0.1.0-SNAPSHOT-standalone.jar
total 36K
drwxrwxr-x  6 j j 4.0K Aug 18 18:14 .
drwxrwxr-x 26 j j 4.0K Aug 18 17:55 ..
drwxrwxr-x  2 j j 4.0K Aug 18 17:55 doc
-rw-rw-r--  1 j j   99 Aug 18 17:55 .gitignore
-rw-rw-r--  1 j j  325 Aug 18 18:14 project.clj
-rw-rw-r--  1 j j  199 Aug 18 17:55 README.md
drwxrwxr-x  3 j j 4.0K Aug 18 17:55 src
drwxrwxr-x  4 j j 4.0K Aug 18 18:02 target
drwxrwxr-x  3 j j 4.0K Aug 18 17:55 test


real    1m2.585s
user    0m4.188s
sys     0m0.120s

С (shutdown-agents):

lein compile && lein uberjar 
    && time java -jar target/closcrite-0.1.0-SNAPSHOT-standalone.jar "ls" "-ahl"                                                                
Compiling closcrite.core
Compilation succeeded.
All namespaces already :aot compiled.
Created /home/j/Development/closcrite/target/closcrite-0.1.0-SNAPSHOT.jar
Including closcrite-0.1.0-SNAPSHOT.jar
Including clojure-1.4.0.jar
Created /home/j/Development/closcrite/target/closcrite-0.1.0-SNAPSHOT-standalone.jar
total 36K
drwxrwxr-x  6 j j 4.0K Aug 18 18:14 .
drwxrwxr-x 26 j j 4.0K Aug 18 17:55 ..
drwxrwxr-x  2 j j 4.0K Aug 18 17:55 doc
-rw-rw-r--  1 j j   99 Aug 18 17:55 .gitignore
-rw-rw-r--  1 j j  325 Aug 18 18:14 project.clj
-rw-rw-r--  1 j j  199 Aug 18 17:55 README.md
drwxrwxr-x  3 j j 4.0K Aug 18 17:55 src
drwxrwxr-x  4 j j 4.0K Aug 18 18:02 target
drwxrwxr-x  3 j j 4.0K Aug 18 17:55 test


real    0m2.817s
user    0m3.796s
sys     0m0.084s

С другой стороны, lein-exec:

      time lein exec -e "(ns blah 
                             (:require [clojure.java.shell :as shell])) 
                         (print ((shell/sh \"ls\" \"-ahl\") :out))"
    total 36K
    drwxrwxr-x  6 j j 4.0K Aug 18 18:14 .
    drwxrwxr-x 26 j j 4.0K Aug 18 17:55 ..
    drwxrwxr-x  2 j j 4.0K Aug 18 17:55 doc
    -rw-rw-r--  1 j j   99 Aug 18 17:55 .gitignore
    -rw-rw-r--  1 j j  325 Aug 18 18:14 project.clj
    -rw-rw-r--  1 j j  199 Aug 18 17:55 README.md
    drwxrwxr-x  3 j j 4.0K Aug 18 17:55 src
    drwxrwxr-x  4 j j 4.0K Aug 18 18:02 target
    drwxrwxr-x  3 j j 4.0K Aug 18 17:55 test

    real    0m1.371s
    user    0m2.136s
    sys     0m0.120s

Конечно, time - не самое главное в профилировании, но это хороший показатель скорости. Для пользователя встроенный сценарий оболочки lein-exec чувствует себя почти в 2 раза быстрее, чем код, который я использовал для моделирования времени выполнения минимального шаблона сценария оболочки leiningen.

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