小编cle*_*mej的帖子

Python多处理池在连接时挂起?

我试图并行地在几个文件上运行一些python代码.该结构基本上是:

def process_file(filename, foo, bar, baz=biz):
    # do stuff that may fail and cause exception

if __name__ == '__main__':
    # setup code setting parameters foo, bar, and biz

    psize = multiprocessing.cpu_count()*2
    pool = multiprocessing.Pool(processes=psize)

    map(lambda x: pool.apply_async(process_file, (x, foo, bar), dict(baz=biz)), sys.argv[1:])
    pool.close()
    pool.join()
Run Code Online (Sandbox Code Playgroud)

我以前使用pool.map来做类似的事情并且效果很好,但我似乎无法使用它,因为pool.map不会(似乎)允许我传入额外的参数(并使用lambda来这样做是行不通的,因为lambda不能编组).

所以现在我正在尝试直接使用apply_async()来解决问题.我的问题是代码似乎挂起并且永远不会退出.一些文件因异常而失败,但我不明白为什么会导致连接失败/挂起?有趣的是,如果没有一个文件因异常而失败,它确实会彻底退出.

我错过了什么?

编辑:当函数(以及工作者)失败时,我看到了这个异常:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 376, in _handle_results
    task = …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

35
推荐指数
2
解决办法
2万
查看次数

使用OpenSSL API以编程方式验证证书链

这与其他问题非常相似,但我看过的问题要么没有答案,要么也不会问同样的问题.我有一个自签名的CA证书,以及使用该CA证书签名的另外两个证书.我很确定证书是正确的,因为'openssl verify'有效:

$ openssl verify -CAfile ca.pem server.pem
server.pem: OK
Run Code Online (Sandbox Code Playgroud)

(以上是从记忆中,我没有在他面前,所以它可能会略微偏离).

现在我想以编程方式验证证书.我有一个带伪代码的实用函数:

int verify_cert(X509 *cert, X509 *cacert)
{
     int ret;
     X509_STORE *store;
     X509_STORE_CTX *ctx;

     store = X509_STORE_new();
     X590_STORE_add_cert(store, cacert);

     ctx = X509_STORE_CTX_new();
     X509_STORE_CTX_init(ctx, store, cert, NULL);

     ret = X590_verify_cert(ctx);

     /* check for errors and clean up */
}
Run Code Online (Sandbox Code Playgroud)

我的问题是上面的代码总是返回"找不到发行者证书".我做错了什么?我相信我正在创建一个新的商店,添加cacert,创建一个新的上下文,并使用指向包含CA的商店的指针将要验证的子证书添加到上下文中.我显然做错了什么,但我不确定是什么.

有任何想法吗?

更新:我知道我可以将这些证书保存到磁盘并使用类似X509_LOOKUP_file之类的东西.我正在寻找一种不会不必要地接触磁盘的解决方案.

c openssl certificate-store x509 pkix

22
推荐指数
3
解决办法
4万
查看次数

使用Android Studio/AVD模拟器开发"系统应用程序"

我正在开发一个需要android.permission.DUMP权限的应用程序.这仅适用于"系统"应用程序(由设备供应商签名的应用程序),或者,我假设具有root权限的应用程序.

如何开发(和测试)使用AVD仿真器的应用程序?我声明了我需要的权限,然后在模拟器中构建并运行应用程序,但是当我到达运行的部分时,无论是否在清单中指定权限,我都会遇到相同的权限错误.

如何开发这些类型的应用程序?

我意识到,如果这是一个真正的设备,我需要根它和/或安装自定义ROM.但肯定有一种方法可以告诉模拟器将我的应用程序视为已经存在.我一直在IDE中寻找"安装应用程序作为系统应用程序"或"以root用户身份运行"复选框,我找不到一个.

android android-emulator android-studio

6
推荐指数
1
解决办法
4254
查看次数

用于大型向量的节省空间的C++向量分配器?

我正在使用一些C++代码来实现一个图形算法,该算法使用了很多小块内存(gSpan的亲戚,但这并不重要).代码在C++中实现,并使用std :: vectors来存储许多小元素(每个元素大约64个字节).但是,我在比原作者更大的数据集上使用它,而且我的内存不足.

然而,似乎我过早地耗尽了记忆.不成?我怀疑这是因为std :: vectors每次需要更多内存时都会尝试增加大小,并且向量会依赖于连续的内存.我有8GB内存和18GB交换,但是当抛出std :: bad_alloc时,我只使用6.5GB驻留和~8GB虚拟.我抓住了bad_alloc调用并打印出矢量大小,这就是我所看到的:

size: 536870912
capacity: 536870912
maxsize: 1152921504606846975
terminate called after throwing an instance of 'std::bad_alloc'
    what():  std::bad_alloc
Run Code Online (Sandbox Code Playgroud)

所以,显然,我们已达到向量的最大大小,并且库正在尝试分配更多,并且失败.

所以我的问题是:

  • 我是否正确认为问题是什么?
  • 解决方案是什么(除了"购买更多内存").我愿意交换CPU时间以适应内存.
  • 我应该转换整个代码使用std :: list(并以某种方式实现operator []代码使用它的地方吗?)..那甚至会更有效吗?至少它会允许列表元素不连续......对吗?
  • 有没有更好的分配器,我可以用来覆盖此用例的向量的标准?
  • 我错过了哪些其他解决方案?

由于我不知道最终会使用多少内存,我知道即使我进行了更改,仍然可能没有足够的内存来进行我的计算,但我怀疑我至少可以获得更多的内存然后我就是现在,这似乎很快就放弃了.

c++ memory-management stdvector

2
推荐指数
1
解决办法
1138
查看次数