我试图并行地在几个文件上运行一些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) 这与其他问题非常相似,但我看过的问题要么没有答案,要么也不会问同样的问题.我有一个自签名的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之类的东西.我正在寻找一种不会不必要地接触磁盘的解决方案.
我正在开发一个需要android.permission.DUMP权限的应用程序.这仅适用于"系统"应用程序(由设备供应商签名的应用程序),或者,我假设具有root权限的应用程序.
如何开发(和测试)使用AVD仿真器的应用程序?我声明了我需要的权限,然后在模拟器中构建并运行应用程序,但是当我到达运行的部分时,无论是否在清单中指定权限,我都会遇到相同的权限错误.
如何开发这些类型的应用程序?
我意识到,如果这是一个真正的设备,我需要根它和/或安装自定义ROM.但肯定有一种方法可以告诉模拟器将我的应用程序视为已经存在.我一直在IDE中寻找"安装应用程序作为系统应用程序"或"以root用户身份运行"复选框,我找不到一个.
我正在使用一些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)
所以,显然,我们已达到向量的最大大小,并且库正在尝试分配更多,并且失败.
所以我的问题是:
由于我不知道最终会使用多少内存,我知道即使我进行了更改,仍然可能没有足够的内存来进行我的计算,但我怀疑我至少可以获得更多的内存然后我就是现在,这似乎很快就放弃了.