镇江网站搭建,在线生成html,WordPress去除官网链接,跨境电商开店平台我有一个守护程序,运行我们的Web服务请求的后台作业.我们有4个工人同时运行.有时,一个作业同时执行两次,因为两个工人决定运行该作业.为了避免这种情况,我们尝试了几件事#xff1a;因为我们的工作来自数据库,所以我们添加了一个称为execute的标志,该标志防止其他工作获得…我有一个守护程序,运行我们的Web服务请求的后台作业.我们有4个工人同时运行.有时,一个作业同时执行两次,因为两个工人决定运行该作业.为了避免这种情况,我们尝试了几件事因为我们的工作来自数据库,所以我们添加了一个称为execute的标志,该标志防止其他工作获得已经开始执行的工作这不能解决问题,有时我们数据库的延迟足以同时执行.在系统中添加了memcached(所有工作程序都在同一个系统中运行),但是由于某种原因,我们今天同时运行了多个作业-memcached不能同时解决多台服务器的问题.这是我们当前正在使用的以下逻辑// We create our memcached server$memcached new Memcached();$memcached-addServer(127.0.0.1, 11211);// Checkup every 5 seconds for operationswhile (true) {// Gather all operations TODO// In this query, we do not accept operations that are set// as executed already.$result findDaemonOperationsPendingQuery();// We have some results!if (mysqli_num_rows($result) 0) {$op mysqli_fetch_assoc($result);echo Found an operation todo # . $op[id] . \n;// Set operation as executedsetDaemonOperationAsDone($op[id], executed);// Verifies if operation is happening on memcachedif (get_memcached_operation($memcached, $op[id])) {echo \tOperation id already executing...\n;continue;} else {// Set operation on memcachedset_memcached_operation($memcached, $op[id]);}... do our stuff}}通常如何解决这种问题我上网查找了一个名为Gearman的库,但是我不相信当我们有多台服务器时,它可以解决我的问题.我想到的另一件事是预定义一个守护程序以在插入时运行该操作,并创建一个故障安全的独占守护程序,该守护程序运行由停止运行的守护程序设置的操作.有任何想法吗谢谢.解决方法:假设每个工作人员都有一个ID,这是使用锁和事务的一种替代解决方案.在循环中运行UPDATE operations SET worker_id :wid WHERE worker_id IS NULL LIMIT 1;SELECT * FROM operations where executed 0 and worker_id :wid;该更新是单个操作,它是原子操作,您仅在尚未设置worker_id的情况下进行设置,因此不必担心竞争状况.设置worker_id可以清楚地知道谁拥有该操作.由于LIMIT 1,此更新将只分配一项操作.标签concurrency,daemon,mysql,php来源 https://codeday.me/bug/20191025/1928540.html