zeroMQ初体验-30.发布/订阅模式进阶-自裁的蜗牛订阅者

探讨了发布/订阅模式中慢速订阅者可能导致的问题,并提出解决方案,包括使用队列缓冲、设置阈值等手段来确保消息传递的可靠性。
在初次介绍[url=http://iyuan.iteye.com/blog/973013]发布/订阅[/url]模式的时候,就已经抖出了这个包袱:如果订阅者的消费速度慢,则会造成发布者端队列堆积,怎么办?本篇即是针对可能出现的"蜗牛"般的订阅者而生。

通常的做法:
在发布端用靠谱的队列承接来不及被消费的信息,这样会增大发布端的压力。
在订阅端用靠谱的队列承接来不及消费的信息,压力转嫁给各订阅端。
与前面相似,在队列中设置阈值,溢出则不收录。
压迫订阅端,当发布端发现订阅端过慢,给予惩罚性质的断开连接。

虽然上述4种方案都还算经典,不过总有欠妥之处。最好的方法莫过于让订阅者明白自个儿能力不足,作出主动性措施,比如:暂时性断开,优化了再来~

至于如何让订阅端检测是否消费能力不足,只需在订阅端设置一个有阈值的队列缓存数据,发布端给所有数据打上标号,如果订阅端读到“断号”,即可认定有数据超出阈值被舍弃了,那么,嘿嘿,主动整改吧。

虽然说中断订阅连接不是太理想,不过,总比不可知,不可控的一味流转数据要可靠的多,只少,都还掌控在自己手中~


//
//  Suicidal Snail
//
#include "czmq.h"

//  ---------------------------------------------------------------------
//  This is our subscriber
//  It connects to the publisher and subscribes to everything. It
//  sleeps for a short time between messages to simulate doing too
//  much work. If a message is more than 1 second late, it croaks.

#define MAX_ALLOWED_DELAY   1000    //  msecs

static void
subscriber (void *args, zctx_t *ctx, void *pipe)
{
    //  Subscribe to everything
    void *subscriber = zsocket_new (ctx, ZMQ_SUB);
    zsocket_connect (subscriber, "tcp://localhost:5556");

    //  Get and process messages
    while (1) {
        char *string = zstr_recv (subscriber);
        int64_t clock;
        int terms = sscanf (string, "%" PRId64, &clock);
        assert (terms == 1);
        free (string);

        //  Suicide snail logic
        if (zclock_time () - clock > MAX_ALLOWED_DELAY) {
            fprintf (stderr, "E: subscriber cannot keep up, aborting\n");
            break;
        }
        //  Work for 1 msec plus some random additional time
        zclock_sleep (1 + randof (2));
    }
    zstr_send (pipe, "gone and died");
}

//  ---------------------------------------------------------------------
//  This is our server task
//  It publishes a time-stamped message to its pub socket every 1ms.

static void
publisher (void *args, zctx_t *ctx, void *pipe)
{
    //  Prepare publisher
    void *publisher = zsocket_new (ctx, ZMQ_PUB);
    zsocket_bind (publisher, "tcp://*:5556");

    while (1) {
        //  Send current clock (msecs) to subscribers
        char string [20];
        sprintf (string, "%" PRId64, zclock_time ());
        zstr_send (publisher, string);
        char *signal = zstr_recv_nowait (pipe);
        if (signal) {
            free (signal);
            break;
        }
        zclock_sleep (1);            //  1msec wait
    }
}

//  This main thread simply starts a client, and a server, and then
//  waits for the client to signal it's died.
//
int main (void)
{
    zctx_t *ctx = zctx_new ();
    void *pubpipe = zthread_fork (ctx, publisher, NULL);
    void *subpipe = zthread_fork (ctx, subscriber, NULL);
    free (zstr_recv (subpipe));
    zstr_send (pubpipe, "break");
    zclock_sleep (100);
    zctx_destroy (&ctx);
    return 0;
}

注意:
这里并未用到数据编号,而是打上了时间戳来判定数据是否延迟到不可接受的地步了,如何自我判定,方法万千,择优即可。

(未完待续)
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
<think>首先,用户的问题是:想解决在Linux环境下编译QT时遇到的错误,具体为configure脚本无法执行的问题。错误信息是:"configurescriptexecutionerrorinlinuxbashwronginterpreternosuchfileordirectory"。我需要基于用户提供的引用来帮助解决这个问题。用户提供了四个引用:-[1]:编译过程中出错,报错是fatalerror:bits/predefs.h:没有那个文件或目录,需要安装multilib包,命令为$sudoapt-getinstallgcc-multilib。-[2]:用户修改了LD_LIBRARY_PATH和LIBRARY_PATH来解决类似错误,但没成功。最后改成了LIBRARY_PATH=/usr/lib/i386-linux-gnu,然后make编译了。-[3]:Ubuntu18.04下运行可执行文件出错,Nosuchfileordirectory。使用file命令检查是32位的可执行文件。-[4]:编译ZeroMQ时出错的记录,涉及touch和make错误。但用户提到,这些引用仅供参考,不是真正的需求。我应该优先参考用户上次的问题和我的回答。用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。”但在对话中,我没有看到用户上一次的问题。系统消息显示这是第一个用户消息,所以可能没有上一次对话,我需要基于当前问题处理。用户的问题是:编译QT时configure脚本执行错误,错误是“wronginterpreternosuchfileordirectory”。这是一个经典的脚本执行问题,通常在Linux中可能是因为脚本路径错误、权限问题或shebang(#!)错误。错误信息的关键部分是:"wronginterpreternosuchfileordirectory"。这表明bash在尝试执行configure脚本时,找不到指定的解释器。在Linux中,脚本第一行通常有shebang,如#!/bin/sh或#!/bin/bash,指定了执行脚本的解释器。可能的根源:1.**文件权限问题**:configure脚本可能没有执行权限。2.**shebang问题**:脚本的shebang行可能指向了一个不存在的解释器路径。3.**路径问题**:bash在查找解释器时出错。4.**兼容性问题**:脚本可能是为其他系统编写的,如Windows换行符问题(CRLFvsLF)导致shebang被破坏。结合用户提供的引用:-[1]提到了头文件缺失,安装了multilib包来解决。-[2]和[3]涉及32位兼容性问题,用户修改了LIBRARY_PATH来指向32位库目录。-[4]是另一个编译错误,但可能与QT无关。用户的具体错误是关于configure脚本执行错误,而不是编译错误。所以重点应该放在脚本执行上。解决方案步骤:1.**检查脚本权限**:确保configure脚本有执行权限。-命令:chmod+xconfigure2.**检查shebang行**:用文本编辑器打开configure脚本,看第一行是否是#!/bin/sh或类似。如果不是,修改为有效的bash路径。-常见问题:如果脚本是从Windows下载的,可能有DOS换行符问题。使用dos2unix工具转换。3.**验证bash是否存在**:运行/bin/bash--version来确认bash安装。4.**考虑架构问题**:如果是在64位系统上编译32位程序,可能需要安装32位库,但configure脚本是shell脚本,通常与架构无关。不过用户的引用[2]和[3]表明可能有32位相关问题。从用户提供的引用[3],它提到了在Ubuntu18.04上运行32位可执行文件出错,错误是"Nosuchfileordirectory",这可能是因为缺少32位库。类似的,configure脚本如果shebang指向了32位的解释器,但系统是64位,可能出问题。在Linux中,shebang通常指向/bin/sh或/bin/bash,这些都是位置不变的。除非脚本有定制shebang。另一个可能性:configure脚本可能损坏或没有完整下载。建议用户:-使用ls-lconfigure检查权限。-用cat-vconfigure或head-1configure查看shebang。-如果有dos2unix,运行dos2unixconfigure来修复换行符。-确保bash安装:sudoapt-getinstallbash(通常已安装)。针对QT编译:QTconfigure脚本在Linux下应该使用bash。确保bash安装并正确配置。生成相关问题:根据系统指令,我需要在回答中添加相关问题。回答结构:-逐步解决问题。-使用中文。-符合LaTeX格式要求:行内数学表达式用$...$,独立公式用$$...$$,并单独成段。-添加引用标识:用户提供的引用要引用,末尾添加[^n]。-生成相关问题。最终回答组织:1.解释错误:说明错误原因。2.给出解决方案步骤。3.引用相关引用,如果需要。4.结束时添加相关问题。</think> ### 解决Linux环境下编译QT时的configure脚本执行错误(错误:wrong interpreter no such file or directory) 在Linux环境下编译QT时,出现"configure script execution error in Linux bash: wrong interpreter: no such file or directory"错误,通常是由于脚本执行权限问题、shebang行(#!)无效或架构兼容性问题导致的。该错误表明Bash无法找到或执行configure脚本指定的解释器路径。以下是逐步解决方案,基于常见Linux环境(如Ubuntu),结合您提供的引用和标准实践进行说明[^2][^3]。 #### 步骤1: 检查脚本权限问题 configure脚本必须具有可执行权限,否则Bash会报告"no such file or directory"错误。 - 使用命令添加执行权限: ```bash $ chmod +x configure ``` - 验证权限: ```bash $ ls -l configure # 应有"-rwxr-xr-x"权限标志 ``` 如果没有权限,Bash无法执行脚本,导致错误。 #### 步骤2: 检查并修复shebang行 shebang行(如#!/bin/sh)指定脚本的解释器路径。如果路径无效(如指向不存在的解释器),会出现"wrong interpreter"错误。 - 查看脚本第一行: ```bash $ head -1 configure # 正常情况下应显示如 "#!/bin/sh" 或 "#!/bin/bash" ``` - 常见问题: - **shebang路径错误**:如果输出像"#!/usr/bin/env bash",但环境中路径未配置,修改为系统默认路径: ```bash $ sed -i '1s|^#!/.*|#!/bin/bash|' configure # 替换为/bin/bash ``` - **换行符问题**:如果脚本在Windows系统编辑过(CRLF换行符),shebang可能被破坏。使用dos2unix工具修复: ```bash $ sudo apt-get install dos2unix # 安装工具(如未安装) $ dos2unix configure # 转换换行符为LF格式 ``` #### 步骤3: 验证解释器存在性和环境 确认shebang指定的解释器(如/bin/bash)在系统中存在且可执行。 - 检查解释器路径: ```bash $ which bash # 应为"/bin/bash" $ /bin/bash --version # 验证是否能正常执行 ``` - 如果/bin/bash缺失,安装或链接解释器: ```bash $ sudo apt-get install bash # 安装Bash(通常已预装) $ ln -s /usr/bin/bash /bin/bash # 创建软链接 ``` - **架构兼容性问题**:如果编译32位QT(如Ubuntu 64位环境),引用[2]表明,库路径可能不正确。确保32位库已安装并配置环境变量: ```bash $ sudo apt-get install gcc-multilib g++-multilib # 安装32位兼容库[^1] $ export LIBRARY_PATH=/usr/lib/i386-linux-gnu:/usr/lib/x86_64-linux-gnu # 显式设置库路径[^2] ``` #### 步骤4: 排除脚本损坏和路径错误 configure脚本可能下载不完整或位置错误。 - 重新下载QT源代码(确保完整): ```bash $ rm -rf qt-source # 删除旧源码 $ wget https://download.qt.io/archive/qt/.../qt-everywhere-src-XXX.tar.xz # 替换为官方下载链接 $ tar -xf qt-everywhere-src-XXX.tar.xz && cd qt-everywhere-src-XXX ``` - 直接在源码目录执行configure(避免路径错误): ```bash $ ./configure # 不要省略 "./" ``` #### 步骤5: 系统基础检查 如果以上步骤无效,进行系统级验证: - 更新系统包和依赖: ```bash $ sudo apt-get update && sudo apt-get upgrade $ sudo apt-get install build-essential libgl1-mesa-dev # QT编译基础依赖 ``` - 检查文件系统: ```bash $ df -h # 确认磁盘空间充足 $ uname -m # 验证系统架构(如x86_64或i386),引用[3]提醒32/64位不匹配[^3] ``` #### 总结 通过以上步骤,错误通常能解决: 1. 修复权限和shebang是首要任务。 2. 架构问题(如32/64位库缺失)需安装multilib包和设置环境变量[^1][^2]。 3. 如果问题持续,检查QT文档或使用官方预编译版(避免源码编译)。 如果所有尝试失败,提供configure脚本的完整输出日志(运行./configure 2>&1 | tee log.txt),以进一步分析[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值