有没有比在这个例子中更好的方法来“锁定”Dart中的端口作为信号量?

时间:2013-08-10 06:23:10

标签: dart

除了在该端口上启动服务器之外,Dart是否可以“锁定”端口。换句话说,我猜,端口充当信号量。另外还有另一种方法可以达到相同的效果吗?

我发布了一个问题,要求解决此问题,Fox32建议在特定端口上启动服务器,并以此方式确定该程序的另一个实例是否已在运行。我需要确定开始实际处理的第一个实例,而不是实际上是否正在运行,并且该解决方案有效。

虽然该解决方案运行良好,但在我看来应该有一个更加量身定制的解决方案。示例代码如下:

/*
 * Attempt to connect to specific port to determine if first process.
 */
async.Future<bool> fTestIfFirstInstance() {

  async.Completer<bool> oCompleter = new async.Completer<bool>();

  const String S_HOST = "127.0.0.1"; // ie: localhost 
  const int    I_PORT = 8087;

  HttpServer.bind(S_HOST, I_PORT).then((oHtServer) {
    ogHtServer = oHtServer;        // copy to global
    oCompleter.complete(true);     // this is the first process
    return;
  }).catchError((oError) {
    oCompleter.complete(false);    // this is NOT the first process
    return;
  });
  return oCompleter.future;
}

2 个答案:

答案 0 :(得分:1)

这通常通过使用文件来完成,例如'/tmp/my_program.lock'或'〜/ .my_program.lock'取决于全局或每用户锁定。

我投入的方式很简单:

bool isRunning() {
  return new File(lockPath).existsSync();
}

开始:

void createLock() {
  if (isRunning()) throw "Lock file '$lockPath' exists, program may be running";
  new File(lockPath).createSync();
}

关闭程序时:

void deleteLock() {
  new File(lockPath).deleteSync();
}

要记住的是,当程序关闭时HttpServer将关闭,文件将不会被删除。这可以通过在创建文件时将程序PID写入锁定文件来解决,并在isRunning中检查PID是否处于活动状态。如果它不活动,请删除该文件并返回false。

答案 1 :(得分:0)

我不确定这个(RawServerSocket)是否更好&#34;然而,与HttpServer解决方案相比,它可能更有意义。

我认为这意味着简单地锁定&#34;港口和解锁港口是值得的。它提供了使用信号量恕我直言的好方法。

/*
 * Attempt to connect to specific port to determine if first process.
 */
async.Future<bool> fTestIfFirstInstance() {
  async.Completer<bool> oCompleter = new async.Completer<bool>(); 
  RawServerSocket.bind("127.0.0.1", 8087).then((oSocket) {
    ogSocket = oSocket;         // assign to global
    oCompleter.complete(true);
  }).catchError((oError) {
    oCompleter.complete(false);
  });

  return oCompleter.future;
}
相关问题