{"id":254277,"date":"2015-04-01T14:18:02","date_gmt":"2015-04-01T10:18:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=254277"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=254277","title":{"rendered":"\u041f\u0440\u043e\u0441\u0442\u043e\u0439 DICOM \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0430 GO \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c \u0437\u0430\u0434\u0430\u0447 \u0438 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c"},"content":{"rendered":"<p>     \t<img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/7a6\/072\/855\/7a6072855a2a468fb6560fb42ad0b478.jpeg\"\/><br \/>  \u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440! \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u043b\u0435\u043a\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 GO. \u0418\u0437\u044f\u0449\u043d\u044b\u0439 \u0438 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041c\u043d\u0435 \u0434\u0430\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435. \u041f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u0438\u043c\u0438 \u0430\u0440\u0445\u0438\u0432\u0430\u043c\u0438 DICOM-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 PACS. <br \/>  <a name=\"habracut\"><\/a><br \/>  \u042f \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 dicom-\u043a\u043b\u0438\u0435\u043d\u0442 \u0441 (\u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a\u043e\u043c..) \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:  <\/p>\n<ul>\n<li>Dicom ping;<\/li>\n<li>C\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439;<\/li>\n<li>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f,<\/li>\n<li>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0440\u0435\u043a\u0432\u0438\u0437\u0438\u0442\u0430\u043c<\/li>\n<\/ul>\n<p>  (c-echo, c-move,c-store,c-find \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0435\u043d\u043e).<br \/>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 dicom-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 GrassRoot SDK. \u041d\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438. \u042f\u0437\u044b\u043a go \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d<\/p>\n<p>  \u041f\u043e\u0445\u043e\u0436\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b \u043e\u043f\u0438\u0441\u0430\u043d <a href=\"http:\/\/habrahabr.ru\/post\/198150\/\">habrahabr.ru\/post\/198150\/<\/a>. <br \/>  \u041d\u0430\u0448 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f:<br \/>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u044f dicom-\u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f 1000 \u0437\u0430\u0434\u0430\u0447, \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0434\u0430\u0447 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0441\u043f\u044f\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u043e\u043b\u044c\u043a\u043e 10 \u0437\u0430\u0434\u0430\u0447 \u0431\u0443\u0434\u0443\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0431\u0430\u043b\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0432\u043e\u043e\u0431\u0449\u0435, \u0442\u0443\u043f\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c 1000 \u0437\u0430\u0434\u0430\u0447 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f.<br \/>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 job_ballancer.go.<\/p>\n<p>  \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430 \u0438 \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<pre><code class=\"go\">type JobDispatcher interface { \tDispatch(interface{}) (interface{}, error) } type ErrDispatcher interface { \tDispatchError(FaJob) error } type CompDispatcher interface { \tDispatchSuccess(CompJob) error } <\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0430, \u043c\u044b \u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438.  <\/p>\n<pre><code class=\"go\">srv.jbBal.Init(&srv.dDisp, srv, srv)   \/\/\u0421\u0430\u043c\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430    &lt;source lang=&quot;go&quot;&gt; type JobBallancer struct { \tjChan    chan interface{}\t\/\/\u043a\u0430\u043d\u0430\u043b \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u044f \tacJob    map[string]Job\t\t\/\/\u0441\u043f\u0438\u0441\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442 \tslJob    map[string]Job\t\t\/\/\u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442 \terrDisp  ErrDispatcher\t\t\/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0440\u0430\u0431\u043e\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0448\u0438\u0445\u0441\u044f error \tjobDisp  JobDispatcher\t\t\/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \tcompDisp CompDispatcher\t\t\/\/\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442 \tJbDone   sync.WaitGroup\t\t\/\/\u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0431\u043e\u0442 \taJobC    int\t\t\t\/\/\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 (\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445) }  \/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 func (jbal *JobBallancer) Init(jdis JobDispatcher, cmd CompDispatcher, erd ErrDispatcher) { \tjbal.errDisp = erd \tjbal.jobDisp = jdis \tjbal.compDisp = cmd \tjbal.acJob = make(map[string]Job) \tjbal.slJob = make(map[string]Job) \tjbal.aJobC = 10 \tjbal.jChan = make(chan interface{}) \tgo jbal.takeJob()\t\t\/\/\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u043e\u0442\u043e\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u043c \t\t\t\t\t\t\t\/\/\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u0440\u0430\u0431\u043e\u0442 \tlog.Println(&quot;info: job ballancer inited&quot;) } \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f, \u0442.\u0435. \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u043d\u0430\u043b, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f takeJob \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0435 \u043e\u0442 \u0442\u0443\u0434\u0430. &lt;source lang=&quot;go&quot;&gt; func (jbal *JobBallancer) PushJob(jdat interface{}) error { \tif jbal.checkInit() { \t\treturn errors.New(&quot;error: JobChan is not inited&quot;) \t} \tuid := genUid() \tjob := Job{JobId: uid, Data: jdat} \tjbal.jChan &lt;- job \treturn nil  }    func (jbal *JobBallancer) takeJob() { \tfor { \t\t\/\/\u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u0437 \u043a\u0430\u043d\u0430\u043b\u0430 \t\trecivedTask := &lt;-jbal.jChan \t\tlog.Println(&quot;info: job taken&quot;) \t\tswitch job := recivedTask.(type) { \t\tcase TermJob: \t\t\t\/\/\u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \t\t\tlog.Println(&quot;info: recive terminate dispatch singal&quot;) \t\t\treturn \t\tcase Job: \/\/\u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 (\u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u043b\u043e\u0442\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442 \u0437\u0430\u043d\u044f\u0442\u044b \u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442) \t\t\tif len(jbal.acJob) &lt; jbal.aJobC { \t\t\t\tjbal.JbDone.Add(1) \t\t\t\tjbal.addActiveJob(job) \t\t\t\tgo jbal.startJob(job) \t\t\t\tlog.Println(&quot;info: normal dispatch&quot;) \t\t\t} else { \t\t\t\tjbal.addSleepJob(job) \t\t\t\tjbal.JbDone.Add(1) \t\t\t\tlog.Println(&quot;info: attend maximum active job&quot;) \t\t\t} \t\tcase CompJob: \t\t\t\/\/\u0440\u0430\u0431\u043e\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0443\u0441\u043f\u0435\u0445\u043e\u043c \t\t\tif err := jbal.compDisp.DispatchSuccess(job); err != nil { \t\t\t\tlog.Println(&quot;error: failed dispatch success&quot; + job.Job.JobId) \t\t\t} \t\t\t\/\/\u0443\u0434\u0430\u0447\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \t\t\tjbal.removeJob(job.Job.JobId) \t\t\tjbal.JbDone.Done() \t\t\tjbal.resumeJobs() \t\tcase FaJob: \t\t\t\/\/\u0440\u0430\u0431\u043e\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \t\t\tif err := jbal.errDisp.DispatchError(job); err != nil { \t\t\t\tlog.Println(&quot;error: failed dispatch error&quot; + job.Job.JobId) \t\t\t} \t\t\t\/\/\u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \t\t\tjbal.removeJob(job.Job.JobId) \t\t\tjbal.JbDone.Done() \t\t\tjbal.resumeJobs() \t\tdefault: \t\t\tlog.Fatalln(&quot;error: unknown job type&quot;) \t\t\tjbal.JbDone.Done() \t\t} \t} } \/\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b func (jbal *JobBallancer) removeJob(jid string) error { \tif _, isFind := jbal.acJob[jid]; isFind { \t\tdelete(jbal.acJob, jid) \t} else { \t\treturn errors.New(&quot;error: can't remove job because job with id not found&quot;) \t} \treturn nil }   \/\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438  \u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0438\u0445 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f func (jbal *JobBallancer) TerminateTakeJob() error { \tif jbal.checkInit() { \t\treturn errors.New(&quot;error: is not inited&quot;) \t} \tjbal.JbDone.Wait() \tjbal.jChan &lt;- TermJob{} \tclose(jbal.jChan) \tif len(jbal.acJob) &gt; 0 { \t\treturn errors.New(&quot;error: list job is not empty&quot;) \t} \tlog.Println(&quot;info: greacefully terminate take job&quot;) \treturn nil } <\/code><\/pre>\n<p>  \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c. \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c<br \/>  <a href=\"https:\/\/github.com\/Loafter\/dtools\/blob\/master\/dcmjsser\/job_ballancer.go\">github.com\/Loafter\/dtools\/blob\/master\/dcmjsser\/job_ballancer.go<\/a><\/p>\n<p>  \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f, \u0447\u0442\u043e \u043a\u043e\u0434 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0438 \u044f \u0434\u043e\u043b\u0433\u043e \u043e\u0431\u0434\u0443\u043c\u044b\u0432\u0430\u043b \u0435\u0433\u043e. \u041d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0437\u0430\u0434\u0430\u0447:   <\/p>\n<pre><code class=\"go\">testJobDispatcher := TestJobDispatcher{} \ttestErrorDispatcher := TestErrorDispatcher{} \ttestSuccessDispatcher := TestCompletedDispatcher{} \tjobBallancer := JobBallancer{} \tjobBallancer.Init(&testJobDispatcher, &testSuccessDispatcher, \t\t&testErrorDispatcher) \tfor i := 0; i &lt; 40; i++ { \t\tjobBallancer.PushJob(&quot;data: &quot; + strconv.Itoa(i)) \t} \tjobBallancer.TerminateTakeJob() <\/code><\/pre>\n<p>   \u041e\u043d \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u0412\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f TerminateTakeJob \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u044b\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b. \u0414\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 sync.WaitGroup JbDone, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0434\u0435\u0442 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442. \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u043b \u0432\u044b\u0448\u0435, \u043a\u043e\u0434 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438.<\/p>\n<p>  \u041a\u0430\u043a \u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0432\u043e\u0435\u0439 \u043f\u043e\u0434\u0435\u043b\u043a\u0435) (http:\/\/habrahabr.ru\/post\/247727\/) \u0438\u043d\u0442\u0435\u0440\u0435\u0444\u0435\u0439\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0432 \u0432\u0438\u0434\u0435 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<br \/>   <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/15c\/a5f\/da3\/15ca5fda32964d42a9360af3abe3fa19.png\"\/><\/p>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 dicom-\u0430\u0440\u0445\u0438\u0432 213.165.94.158:11112. \u0421 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u0430\u0439\u043f\u0438 \u0438 \u0435\u0441\u043b\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0442 \u043f\u043e\u0440\u0442 11112. \u0422\u0430\u043a \u0436\u0435 \u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c dicom-\u0430\u0440\u0445\u0438\u0432\u0435 dcm4che <a href=\"http:\/\/sourceforge.net\/projects\/cdmedicpacsweb\/files\/latest\/download?source=files\">sourceforge.net\/projects\/cdmedicpacsweb\/files\/latest\/download?source=files<\/a>.<br \/>   \u041c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u043b\u044f Linux, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434 Widows \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 grassroot \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u043b\u0430\u0441\u044c, \u043d\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0440\u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u043a\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <br \/>  cmd\/ld: Malformed PE file: Unexpected flags for PE section. <\/p>\n<p>  \u041e\u0431 \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435 \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0442\u0443\u0442: <a href=\"https:\/\/github.com\/golang\/go\/issues\/4069\">github.com\/golang\/go\/issues\/4069<\/a>.<br \/>   \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u044f \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u0441 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u0441\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 Linux. \u041c\u043e\u0436\u0435\u0442 \u00ab\u0445\u0430\u0431\u0440\u0430-\u044d\u0444\u0435\u043a\u0442\u00bb \u0441\u0434\u0432\u0438\u043d\u0435\u0442 \u0441 \u043c\u0435\u0440\u0442\u0432\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0414\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 Windows, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u043d\u0430 \u0431\u0430\u0437\u0435 CoreOS (https:\/\/yadi.sk\/d\/y81KC-tyfar6A). \u0412 \u0434\u0435\u043c\u043e \u043c\u0430\u0448\u0438\u043d\u0435 \u043d\u0430\u0448 dicom-\u043a\u043b\u0438\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a systemd-\u0441\u0435\u0440\u0432\u0438\u0441.<br \/>   \u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u044f, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 dicom-\u0443\u0437\u043b\u043e\u0432, \u0438 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432 zip-\u0430\u0440\u0445\u0438\u0432\u0435 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c json-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0448 GUI.<br \/>   \u0410 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c, \u043a\u0430\u043a \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b \u044f: \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0435\u0431-\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430 \u0431\u0430\u0437\u0435 html5. <\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/7d4\/994\/d68\/7d4994d686974d72bb8045a784e5227b.png\"\/><br \/>  Github: <a href=\"https:\/\/github.com\/Loafter\/dtools\">github.com\/Loafter\/dtools<\/a><br \/>  \u0412\u0435\u0440\u0441\u0438\u044f Linux-amd64: <a href=\"https:\/\/github.com\/Loafter\/dtools\/releases\/download\/1.0\/dcmjsser\">github.com\/Loafter\/dtools\/releases\/download\/1.0\/dcmjsser<\/a>     \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/254581\/\"> http:\/\/habrahabr.ru\/post\/254581\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t<img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/7a6\/072\/855\/7a6072855a2a468fb6560fb42ad0b478.jpeg\"\/><br \/>  \u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440! \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0432\u043b\u0435\u043a\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 GO. \u0418\u0437\u044f\u0449\u043d\u044b\u0439 \u0438 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041c\u043d\u0435 \u0434\u0430\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435. \u041f\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0441\u043a\u0438\u043c\u0438 \u0430\u0440\u0445\u0438\u0432\u0430\u043c\u0438 DICOM-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 PACS.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-254277","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/254277","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=254277"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/254277\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=254277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=254277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=254277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}