我正在尝试使用ZMQ_DONTWAIT标志使用ZeroMQ实现非阻塞接收方法,但recv()行为就像没有标志时调用:
auto start = std::chrono::steady_clock::now();
auto have_data = sock_->recv(&reply, ZMQ_DONTWAIT);
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - start).count();
std::cout << duration << " " << have_data;
Run Code Online (Sandbox Code Playgroud)
sock_是一个zmq::socket_t实例化为REQ套接字.
在这种情况下have_data,始终为true,duration无论REP服务器采取何种回复(0到几百毫秒).
请注意,我所说的ZeroMQ的cpp绑定定义在zmq.hpp哪里,recv() 而不是声明zmq.h:
inline bool recv (message_t *msg_, int flags_ = 0);
Run Code Online (Sandbox Code Playgroud)
如果已收到数据,则recv()返回此处true,false如果errno是,则返回EAGAIN
是否有任何先决条件,ZMQ_DONTWAIT使recv()立即回报?
(我使用的是zmq4.1.2版本)
I have two fairly identical (Linux-) systems but one with just a minimum set of packages installed. On one system I have a running (binary/ELF) executable which I want to copy over to the other system (with the minimum setup).
Now I need a way to copy all needed shared libraries as well. Currently I start the application on the source system and then go through the output of
lsof | grep <PID>
Run Code Online (Sandbox Code Playgroud)
or
ldd <FILE>
Run Code Online (Sandbox Code Playgroud)
to get a list …
我知道我缺乏基本的詹金斯概念,但以我目前的知识,很难成功地进行研究——也许你可以给我一些提示,如果需要的话,我可以用它来重新表述我的问题。
目前,我面临着这样一种情况:在具有多个构建节点的设置中,Jenkins 主计算机的磁盘空间不足,因为 Jenkins 在主节点和构建节点上都克隆了 git 存储库(并且主节点的空间有限)。这个问题解释了原因。
注意:主节点本身不构建任何东西 - 它只是将存储库克隆到本地工作区文件夹(我猜它只需要 Jenkinsfiles)。
通过作业配置并谷歌搜索这个问题,我找到了有关浅层和稀疏克隆的选项,或者使用Cleanup Plugin在构建之前或之后清理工作区的选项。但这些设置和插件只关心构建节点checkout(SCM)上完成的签出,而不是主节点。
但如果我想保持构建节点上的情况不变,但保持 Jenkins 主计算机上的工作区文件夹精简,我该如何解决这个问题?我必须寻找什么?
作为一个附带问题 - 是否有可能有“git Export”之类的东西?即.git在检查我需要的提交后删除文件夹?
如果这取决于我使用的作业类型,我将使用脚本化管道作业。
我想dragend以不同的方式处理事件,具体取决于元素是否刚刚被拖动到浏览器窗口(或站点对应)内部或外部(例如外部文件管理器)。
在我没有找到实例的任何属性DragEvent来指示它是在站点上下文内部还是外部之后,我开始通过算术计算出相应的鼠标事件是否仍然发生在站点的几何结构内部。
最终我可能会成功使用这种方法(目前还没有工作),但它有一个主要缺点(先不说它的丑陋):放置目标窗口可能位于浏览器的顶部,因此几何图形根本不是真正的指示器。
那么..我如何找出dragend(或我可以用来存储某些状态的任何其他事件)是否指向浏览器窗口(或源站点)之外?
我需要一种sleep()可以中止的方法(如此处或此处所述).
我的方法是threading.Event.wait()在指定的持续时间内超时:
def abortable_sleep(secs, abort_event):
abort_event.wait(timeout=secs)
abort_event.clear()
Run Code Online (Sandbox Code Playgroud)
在调用之后abortable_sleep(10, _abort)我现在可以(从另一个线程)调用_event.set(_abort)让它abortable_sleep()在10秒之前终止.
例:
def sleeping_thread():
_start = time.perf_counter()
print("%f thread started" % (time.perf_counter() - _start))
abortable_sleep(5, _abort)
print("%f thread stopped" % (time.perf_counter() - _start))
if __name__ == '__main__':
_abort = threading.Event()
while True:
threading.Thread(target=sleeping_thread).start()
time.sleep(3)
_abort.set()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
输出:
0.000001 thread started
3.002668 thread stopped
0.000002 thread started
3.003014 thread stopped
0.000001 thread started
3.002928 thread stopped
0.000001 thread started …Run Code Online (Sandbox Code Playgroud) 我有一个容器shared_ptr<>,例如a vector<shared_ptr<string>> v,我想迭代v指示const-ness.
这段代码:
vector<shared_ptr<string>> v;
v.push_back(make_shared<std::string>("hallo"));
...
for (const auto &s : v) {
*s += "."; // <<== should be invalid
}
Run Code Online (Sandbox Code Playgroud)
看起来像我想要做的(表明那s是const)但当然它不会成为字符串const.
是否有一种优雅的方法来迭代一个容器,shared_ptr明确表示内容不会被修改?
就像是
for (shared_ptr<const string> s : v) {
*s += "."; // <<== will not compile
}
Run Code Online (Sandbox Code Playgroud)
(但是这段代码不会因其他原因编译:))
编辑:
我犯了一个错误.最初我正在声明一个引用,这会导致编译器错误
for (shared_ptr<const string> &s : v) { // <<== does not compile
...
}
Run Code Online (Sandbox Code Playgroud)
如果您声明shared_ptr<const string>该示例有效.在我看来,这是一个很好的权衡,但这样一来指针被复制,这在循环中耗费大量代码和大容器时会很费时间.
从今天开始,有任何方法可以将本机JS脚本与从C ++代码(从Emscripten,chirp,clang-8 +等)生成的模块组合在一起,从而可以在重新使用模块的同时交换/修改脚本(即不必重新处理它们)在Node.js 和浏览器环境中都可以使用?
这句话很长-让我举个例子:
我想用JavaScript编写一些代码(例如测试代码),该代码使用fooC ++中实现的库(例如)。
我当前的(工作)设置如下所示:
浏览器
test1.js \
\
===(webpack)==> full.js
/
foo.cpp ==(emscripten)==> foo.js /
Run Code Online (Sandbox Code Playgroud)
Node.js:
foo.cpp ==(gcc/N-API)==> foo.node <--(require)-- test1.js
Run Code Online (Sandbox Code Playgroud)
浏览器方法的问题在于(AFAIK)每次修改/交换时我都必须重新运行WebPack test1.js才能将更改引入浏览器。
就我而言,运行webpack可能要花费很长时间,并且生成的构件相当大(10MB的倍数)。另外,我想在没有WebPack的相对较小的设备上运行代码,所以我什至每次都必须将这些工件传输到设备上。
因此,我现在想foo在一个地方(例如,在设备上)保留一个包含模块(无论如何看起来)的预处理工件,同时仅交换相对较小的本机JavaScript代码(test1.js)。(想象一下test*.js一个连续执行数百个文件的测试场景)
使用现代的浏览器/工具,ES6,ESM或您可以想到的任何方法-是否有办法为浏览器实现此目的?
奖励点是一个答案,它使我可以编写无需修改即可在Node.js 和浏览器中使用的代码。:)
抱歉:这是我什至不想使用WebPack时对此问题的修改,但现在我降低了期望。
也许我只是没有搜索正确的词,但是我被困住了。
我需要从C ++调用JavaScript函数,这与使用普通C API可以完成的操作非常相似。
注:我不希望传递一个回调到C ++代码,但我已经知道要调用的函数的名称!
因此,例如,我在JavaScript中具有以下功能:
function log_message_callback(context, message) {
console.log(`${context}: ${message}`);
}
my_napi_module.initialize(); // <-- starts thread that would call log_message_callback
Run Code Online (Sandbox Code Playgroud)
从C ++我想调用它(顺便说一句,来自与主线程不同的线程):
function log_message_callback(context, message) {
console.log(`${context}: ${message}`);
}
my_napi_module.initialize(); // <-- starts thread that would call log_message_callback
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?我该怎么做?我应该一直在寻找什么?
想象一下以下命令:
a = {'key1': {'subkey1': [1, 2, 3]}}
b = {'key1': {'subkey2': [1, 2, 3]}}
Run Code Online (Sandbox Code Playgroud)
我想合并它们以获得
c = {'key1': {'subkey1': [1, 2, 3],
'subkey2': [1, 2, 3]}}
Run Code Online (Sandbox Code Playgroud)
额外好的解决方案是返回深层副本a,b我可以在不更改a或的情况下进行更改b。
c = {**a, **b}
Run Code Online (Sandbox Code Playgroud)
看起来不错,但似乎与我的情况c = copy(a).update(b)返回的结果相同,因为被更新覆盖。bkey1
您当然可以像这样手动执行此操作(在另一个答案中找到):
def combine_dict(map1: dict, map2: dict):
def update(d: dict, u: dict):
for k, v in u.items():
if isinstance(v, collections.Mapping):
r = update(d.get(k, {}), v)
d[k] = r
else:
d[k] = u[k]
return d …Run Code Online (Sandbox Code Playgroud) c++ ×4
javascript ×3
python ×2
const ×1
containers ×1
dependencies ×1
dictionary ×1
emscripten ×1
events ×1
executable ×1
gerrit ×1
html ×1
iteration ×1
jenkins ×1
linux ×1
module ×1
n-api ×1
node.js ×1
nonblocking ×1
pointers ×1
process ×1
python-3.5 ×1
thread-sleep ×1
wayland ×1
webpack ×1
window ×1
x11 ×1
zeromq ×1