小编Ele*_*ito的帖子

loop.create_task,asyncio.async/ensure_future和Task之间有什么区别?

我对某些asyncio功能感到有些困惑.我看到有BaseEventLoop.create_task(coro)安排合作例程的功能.文档create_task说它是一个新函数和兼容性,我们应该asyncio.async(coro)通过再次引用docs来看到它是一个别名,asyncio.ensure_future(coro)它再次调度一个协同例程的执行.

与此同时,我一直在Task(coro)用于调度协同例程执行,而且似乎也工作得很好.那么,这些之间的区别是什么?

python coroutine python-3.x python-asyncio

31
推荐指数
1
解决办法
7236
查看次数

在非标准前缀中安装glib失败

我正在尝试在非标准前缀中安装glib,但运行时我得到以下内容make install:

/bin/sh ../libtool --mode=install /usr/bin/install -c libgthread-2.0.la '/root/build/lib'
libtool: install: error: cannot install `libgthread-2.0.la' to a directory not ending in /usr/local/lib
Run Code Online (Sandbox Code Playgroud)

必须在以/ usr/local/lib结尾的前缀中安装gthread的原因是什么?

install makefile glib libtool

27
推荐指数
1
解决办法
1万
查看次数

mmap和内存使用情况

我正在编写一个程序,它从网络接收大量数据(不同大小的数据),处理它们并将它们写入内存.由于某些数据可能非常大,我目前的方法是限制使用的缓冲区大小.如果一个片段大于最大缓冲区大小,我将数据写入临时文件,然后以块的形式读取文件以进行处理和永久存储.

我想知道这是否可以改善.我一直在阅读关于mmap的一段时间,但我不是百分百肯定它是否可以帮助我.我的想法是使用mmap来读取临时文件.这有什么用?我担心的主要问题是,偶尔的大块数据不应该填满我的主内存,导致其他所有内容都被换掉.

另外,您认为临时文件的方法是否有用?我是否应该这样做,或者,或许,我应该相信Linux内存管理器为我做这项工作?或者我应该完全做其他事情?

linux memory memory-management mmap

14
推荐指数
1
解决办法
1万
查看次数

无论调用多少次,dlclose都不会真正卸载共享对象

我的程序dlopen用来加载共享对象,然后dlclose卸载它.有时这个共享对象会再次加载.我注意到静态变量没有重新初始化(这对我的程序来说至关重要)所以我在之后添加了一个测试(dlopenwith RTLD_NOLOAD)dlclose来查看库是否真的被卸载了.果然,它还在记忆中.

然后我尝试dlclose反复调用,直到库真的被卸载,但我得到的是一个无限循环.这是我用来检查库是否已卸载的代码:

dlclose(handles[name]);

do {
  void *handle = dlopen(filenames[name], RTLD_NOW | RTLD_NOLOAD);
  if (!handle)
    break;

  dlclose(handle);
} while (true);
Run Code Online (Sandbox Code Playgroud)

我的问题是,dlclose考虑到我的dlopen调用是唯一加载它的地方,我的共享对象之后没有被卸载的可能原因是什么.你能否提出一个行动方案来追查问题的根源?另外,为什么重复调用dlclose没有效果,它们每个都递减引用计数,不是吗?

编辑:刚刚发现只有当我用gcc编译时才会发生这种情况.有了clang,一切都很好.

c c++ linux gcc dlopen

12
推荐指数
3
解决办法
6400
查看次数

可以多次定义C结构吗?

我已经在几个地方读过可以安全地多次定义C结构,但是我从gcc中获得了"重新定义结构"错误,用于多次定义结构(通过多个包含).一个非常简单的示例如下所示:

foo.c的:

#include "a.h"
#include "b.h"

int main(int argc, char *argv[]) {
  struct bar b;
  b.a = 2;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

啊:

struct bar {
  int a;
  int b;
};
Run Code Online (Sandbox Code Playgroud)

BH:

#include "a.h"

struct buz {
  int x;
  int y;
};
Run Code Online (Sandbox Code Playgroud)

如果我跑,gcc foo.c我得到:

In file included from b.h:1:0,
                 from foo.c:2:
a.h:1:8: error: redefinition of ‘struct bar’
a.h:1:8: note: originally defined here
Run Code Online (Sandbox Code Playgroud)

我知道我没有放任何包含警卫,那些将修复编译错误,但我的理解是,这应该工作.我也在struct barfoo.c中尝试了两个定义,我得到了相同的错误消息?那么,结构是否可以在C中定义多次?

c struct

9
推荐指数
1
解决办法
2565
查看次数

使用libwireshark以编程方式获取Wireshark功能

如果我想编写一个使用Wireshark功能的脚本,我会使用tshark.我听说还有一个libwireshark可以在用C编写程序时使用但是,对于我的生活,我找不到任何文档!我尝试在wireshark源代码树中隔离库代码,但似乎代码组织不是很好,并且不存在这样的隔离(要么就是这样,要么我找不到它).

我有两个问题:

  1. 我是否正确地认为libwireshark确实可以用来以编程方式获得我可以从wireshark/tshark获得的任何功能?
  2. 你能指点我这个主题的任何文档/教程/例子吗?即使是一些简单的例子也可以有很长的路要走.如果不这样做,你能指点我解释一下如何在wireshark源代码树中找到自己的方式吗?

wireshark

9
推荐指数
1
解决办法
7739
查看次数

如何在使用Python请求时获取底层套接字

我有一个Python脚本,使用请求库创建许多短暂的同时连接.我特别需要找出每个连接使用的源端口,我想我需要访问底层套接字.有没有办法通过响应对象获取此信息?

python sockets port python-requests

8
推荐指数
1
解决办法
2481
查看次数

如何同步等待 Dart Future 完成

假设我有一个异步函数,我想在同步函数中调用它。例如:

Future<int> foo() async {
  // do something
  return 109;
}

int bar() {
  var r = wait_for_future(foo());
  return r;
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是wait_for_future. 这甚至可以在 Dart 中完成吗?

asynchronous dart

8
推荐指数
1
解决办法
5876
查看次数

重建.pyc文件后,仍然存在错误的幻数错误

运行我的Python 3脚本时,遇到"Bad magic number"错误(当脚本尝试导入另一个模块时).起初我想象它是因为有Python构建的.pyc文件.我删除了__pycache__目录并重新编写了脚本,但是在导入该模块时,解释器仍然给出了同样的错误.有任何想法吗?

更新:为了澄清,我应该提到脚本中的import语句本身不会导致错误.这是堆栈跟踪:

Traceback (most recent call last):
  File "../mvc/test.py", line 6, in <module>
    from property import Property
  File "/home/mostafa/python/mvc/property.py", line 1, in <module>
    from owned import owned
  File "/home/mostafa/python/owned/__init__.py", line 1, in <module>
    from list import OwnedList
ImportError: Bad magic number in /home/mostafa/python/list.pyc
Run Code Online (Sandbox Code Playgroud)

python python-3.x

7
推荐指数
1
解决办法
4990
查看次数

在 shell 脚本中可移植地捕获 ERR

我正在尝试编写一个 shell 脚本,该脚本在命令失败时中止并显示有问题的行号。

set -e
trap 'echo "$0 FAILED at line ${LINENO}"' ERR
Run Code Online (Sandbox Code Playgroud)

结果发现陷阱行不适用于 Ubuntu 的默认 shell 脚本解释器 dash。如果我将 shebang 行更改#!/bin/bash为此有效但不使用#!/bin/sh. 有没有办法在不依赖 bash 的情况下完成这项工作?

顺便说一句,我从破折号得到的错误是这样的:

trap: ERR: bad trap
Run Code Online (Sandbox Code Playgroud)

error-handling bash shell dash-shell

7
推荐指数
2
解决办法
3037
查看次数