首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现基于文件的持久堆栈?

如何实现基于文件的持久堆栈?
EN

Stack Overflow用户
提问于 2012-12-21 15:29:51
回答 2查看 116关注 0票数 0

我有一个API来登录到一个系统。它不支持使用同一个用户id的并发登录(我猜是因为许可证)。但是,这个代码可以由来自另一个系统的不同用户启动的不同进程/客户端调用,在我的例子中,是一个ClearCase触发器。

代码语言:javascript
复制
my $conn = new BuildForge::Services::Connection('ccbuildforged01', 3966);
my $token = $conn->authUser('bldforge', 'password');

我有两个选择。

  1. 返回的$token可以由不同的客户端共享。那么,我如何能够持久化这个$token呢?
  2. 我有10个许可证,所以可以创建10个用户。如何为所有客户端创建基于文件的持久堆栈以共享这些用户ids?

我谷歌了一下,发现:一个简单的文件和一个锁似乎就是你所需要的。你按锁,附加,解锁。你打开锁,寻找,阅读,截断,解锁。

有人能给我一个代码样本吗?

EN

回答 2

Stack Overflow用户

发布于 2012-12-21 23:08:09

我会用用户信息维护10个文件(比如1.conf,但10.conf)。

要获得可用的用户id,请查找没有对应.pid文件的.pid文件(例如,1.pid)。如果您找到了一个独占锁,请尝试获取该文件的独占锁,然后创建相应的.pid文件并对其进行独占锁定。(如果其中任何一个失败,请查找另一个文件。)

完成后,释放.conf文件上的锁,然后释放锁并删除.pid文件。

如果您想避免可能的争用条件,可以在查找可用的用户id之前尝试锁定一个queue.lock文件。如果它已经被锁定,等待锁被释放。

票数 1
EN

Stack Overflow用户

发布于 2012-12-31 16:39:28

  1. 为什么我们需要额外的.pid文件?锁定.conf文件还不够吗?
  2. 使用以下代码,如果同时启动该程序的两个实例,则第二个实例等待第一个实例解锁,然后锁定第一个文件id01.txt。它在等待阅读。如果文件被锁定了,我如何让它转到下一个文件? 使用FileHandle;使用Fcntl qw(:flock); ($count = 1;$count <= 8;$count++) { if (打开SELF,"< id0$count.txt");if (flock(SELF,LOCK_EX)) {#独占锁定打印“锁定id0 0$Count.txt.\n”;睡眠(10);关闭SELF;}open{ next } }{ next;}打印“未锁定的id0 0$Count.txt.\n”;}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13992827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档