我将Process类子类化为一个我称之为EdgeRenderer的类.我想使用multiprocessing.Pool
,除了常规进程,我希望它们是我的EdgeRenderer的实例.可能?怎么样?
我们的Java应用程序(在Jetty 7.5.4上运行的Web应用程序)使用底层数据库.有多个数据库用户,Java部分需要使用这些数据库用户访问数据库.我想知道是否有一个数据库连接池库让我们可以访问具有多个数据库用户的数据库.我知道有一堆dbcp库可以让我们使用单个数据库用户,但是找不到任何支持多个数据库用户的库.
任何帮助表示赞赏,谢谢,Pram.
我正在使用 Python 的多处理器库并想知道我可以调用的最大工作进程是多少?
例如我已经定义 async.pool = Pool(100)
哪个允许我同时运行最多 100 个异步进程,但我不知道它的真正最大值是多少?
有谁知道如何找到我的池的最大值?我猜这取决于 CPU 或内存。
我正在使用Apache Commons Pool 2实现为我的应用程序提供对象池机制.
截至目前,我已设置的默认值maxTotal()
,并maxIdle()
为10
在我的代码.
但我无法理解它们之间有什么区别?如果我将maxIdle()
值设置为非常小(假设为0)或非常大(等于maxTotal()
),该怎么办?
注意:Apache类在内部建议上述两个配置的默认值为8.
我需要运行许多进程,但不能全部运行,例如同时运行 4 个进程。multiprocessing.Pool
正是我需要的。但问题是,如果进程持续时间超过超时(例如 3 秒),我需要终止进程。Pool
只支持等待所有进程的超时,而不是每个进程。这就是我需要的:
def f():
process_but_kill_if_it_takes_more_than_3_sec()
pool.map(f, inputs)
Run Code Online (Sandbox Code Playgroud)
我找不到使用Pool
超时的简单方法。有一个解决方案,从礼Bendersky。这是一个通过Thread.join(timeout)
. 它有效,(尽管它的停止方法效果不佳)。但是这个方法运行一个新的不必要的线程,而进程的主线程只是在等待,因为我们需要一个超时控制器。应该可以从一个点控制所有超时,如下所示:
import time
from multiprocessing import Process
def f(n):
time.sleep(n)
timeout = 3
tasks = [1, 2, 4, 1, 8, 2]
procs = []
pool_len = 4
while len(tasks) > 0 or len(procs) > 0:
if len(tasks) > 0 and len(procs) < pool_len:
n = tasks.pop(0)
p = Process(target=f, args=(n,))
p.start()
procs.append({'n': n, 'p': p, 't': time.time() + timeout}) …
Run Code Online (Sandbox Code Playgroud) 对于multiprocessing
有Process
,我可以使用Value, Array
设置args
PARAM.
随着multiprocessing
用Pool
,怎么用Value, Array.
没有什么在如何做到这一点的文档.
from multiprocessing import Process, Value, Array
def f(n, a):
n.value = 3.1415927
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
num = Value('d', 0.0)
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
Run Code Online (Sandbox Code Playgroud)
我想Value, Array
在下面的代码片段中使用.
import multiprocessing
def do_calc(data):
# access num or
# work to update arr
newdata =data * 2
return …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将代码中的线程切换到多处理以衡量其性能,并希望实现更好的暴力破解潜力,因为我的程序旨在暴力破解受密码保护的 .zip 文件。但是每当我尝试运行该程序时,我都会得到以下信息:
BruteZIP2.py -z "Generic ZIP.zip" -f Worm.txt
Traceback (most recent call last):
File "C:\Users\User\Documents\Jetbrains\PyCharm\BruteZIP\BruteZIP2.py", line 40, in <module>
main(args.zip, args.file)
File "C:\Users\User\Documents\Jetbrains\PyCharm\BruteZIP\BruteZIP2.py", line 34, in main
p.start()
File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\multiprocessing\process.py", line 112, in start
self._popen = self._Popen(self)
File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\multiprocessing\context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\multiprocessing\context.py", line 322, in _Popen
return Popen(process_obj)
File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
reduction.dump(process_obj, to_child)
File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot serialize '_io.BufferedReader' object
Run Code Online (Sandbox Code Playgroud)
我确实找到了与我有相同问题的线程,但它们都没有得到答复/未解决。我也尝试Pool
在上面插入,p.start()
因为我相信这是由于我在基于 …
我已经从python多处理模块创建了一个池,并希望更改池已运行或添加到它们的进程数.这可能吗?我试过这样的东西(我的代码的简化版)
class foo:
def __init__():
self.pool = Pool()
def bar(self, x):
self.pool.processes = x
return self.pool.map(somefunction, list_of_args)
Run Code Online (Sandbox Code Playgroud)
它似乎工作并实现了我最终想要的结果(这是在多个进程之间分割工作)但我不确定这是最好的方法,或者为什么它工作.
我正在为Android编写游戏,其中有敌人飞过屏幕然后消失,被其他敌人取代.现在,这种情况发生得非常快,我的代码目前执行大量的内存分配和释放来创建和删除这些敌人对象,所以我试图找到一种方法来优化它.我从一本关于android游戏开发的书中得到了这个Pool类的实现:
public class Pool<T> {
public interface PoolObjectFactory<T> {
public T createObject();
}
private final List<T> freeObjects;
private final PoolObjectFactory<T> factory;
private int maxObjects;
public Pool(PoolObjectFactory<T> factory, int maxObjects) {
this.maxObjects = maxObjects;
this.factory = factory;
freeObjects = new ArrayList<T>(maxObjects);
}
public T newObject() {
T object = null;
if (freeObjects.isEmpty()) {
object = factory.createObject();
} else {
object = freeObjects.remove(freeObjects.size() - 1);
}
return object;
}
public void free(T object) {
if (freeObjects.size() < maxObjects) freeObjects.add(object);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用这个类的方法如下: …
mp.set_start_method('spawn')
total_count = Counter(0)
pool = mp.Pool(initializer=init, initargs=(total_count,), processes=num_proc)
pool.map(part_crack_helper, product(seed_str, repeat=4))
pool.close()
pool.join()
Run Code Online (Sandbox Code Playgroud)
因此,我有一组工作人员在做一些工作。它只需要找到一个解决方案。因此,当一个工作进程找到解决方案时,我想停止一切。
我想到的一种方法是只调用sys.exit()。但是,由于其他进程正在运行,因此似乎无法正常工作。
另一种方法是检查每个进程调用的返回值(part_crack_helper函数的返回值),然后在该进程上终止调用。但是,我不知道在使用该map函数时该怎么做。
我应该如何实现呢?