相关疑难解决方法(0)

Python多处理库错误(AttributeError:__ exit__)

使用时遇到此错误pool.map(funct, iterable):

AttributeError: __exit__
Run Code Online (Sandbox Code Playgroud)

否解释,只将堆栈跟踪到模块中的pool.py文件.

以这种方式使用:

with Pool(processes=2) as pool:
   pool.map(myFunction, mylist)
   pool.map(myfunction2, mylist2)
Run Code Online (Sandbox Code Playgroud)

我怀疑可挑选性可能存在问题(python需要pickle,或将列表数据转换为字节流)但我不确定这是否属实或是否如何调试.

编辑:产生此错误的新格式代码:

def governingFunct(list):
    #some tasks
    def myFunction():
         # function contents
    with closing(Pool(processes=2)) as pool:
         pool.map(myFunction, sublist)
         pool.map(myFunction2, sublist2)
Run Code Online (Sandbox Code Playgroud)

错误产生:

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Run Code Online (Sandbox Code Playgroud)

python pickle multiprocessing with-statement contextmanager

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

在Python中为多处理共享内存的更好方法是什么?

我已经解决了这个问题一个星期了,而且它变得非常令人沮丧,因为每次我实现一个更简单但相似的我需要做的比例示例时,事实证明多处理会捏造它.它处理共享内存的方式令我困惑,因为它非常有限,它可能会很快变得无用.

所以我的问题的基本描述是我需要创建一个进程,该进程在一些参数中传递以打开图像并创建大小为60x40的大约20K补丁.这些补丁一次保存到列表2中,需要返回到主线程,然后由GPU上运行的其他2个并发进程再次处理.

过程和工作流程以及所有大部分都需要处理的事情,我现在需要的是最容易被认为是最困难的部分.我无法保存并将带有20K补丁的列表返回到主线程.

第一个问题是因为我将这些补丁保存为PIL图像.然后我发现添加到Queue对象的所有数据都必须被pickle.第二个问题是我然后将补丁转换为每个60x40的数组并将它们保存到列表中.而现在仍然不起作用?显然,当您调用queue_obj.get()程序挂起时,队列可以保存有限数量的数据.

我尝试过很多其他的东西,而且我尝试的每一件新东西都不起作用,所以我想知道是否有人有一个库的其他建议我可以使用它来共享对象而没有所有模糊的东西?

这是我正在看的一种示例实现.请记住,这完全正常,但完全实现不会.我确实有代码打印信息性消息,以确保保存的数据具有完全相同的形状和一切,但由于某种原因它不起作用.在完整实现中,独立进程成功完成,但在q.get()处冻结.

from PIL import Image
from multiprocessing import Queue, Process
import StringIO
import numpy

img = Image.open("/path/to/image.jpg")
q = Queue()
q2 = Queue()
#
#
# MAX Individual Queue limit for 60x40 images in BW is 31,466.
# Multiple individual Queues can be filled to the max limit of 31,466.
# A single Queue can only take up to 31,466, even if split up in different puts.
def rz(patch, qn1, qn2):
    totalPatchCount = 20000
    channels …
Run Code Online (Sandbox Code Playgroud)

python multithreading shared-memory multiprocessing python-multiprocessing

10
推荐指数
1
解决办法
7211
查看次数

生成排列可以并行完成吗?

我想知道我是否可以加快排列的产生.具体来说,我正在使用[az]中的8个,我想使用[a-zA-Z]中的8个和[a-zA-Z0-9]中的8个.我所知道的将很快占用大量的时间和空间.

即使仅使用小写ASCII字符的长度为8的排列也需要一段时间并生成千兆字节.我的问题是我不理解底层算法,所以我无法弄清楚我是否可以将问题分解成比我以后可以加入的更小的任务.

我用来生成排列列表的python脚本:

import string
import itertools
from itertools import permutations

comb = itertools.permutations(string.ascii_lowercase, 8)

f = open('8letters.txt', 'w')
for x in comb:
        y = ''.join(x)
        f.write(y + '\n')

f.close()
Run Code Online (Sandbox Code Playgroud)

有谁知道如何将其划分为子任务并将它们放在一起?有可能吗?

我可能只是尝试(可能)更快的方式,但我遇到了C++及其std :: next_permutation()的问题,所以我无法验证它是否可以加速甚至一点点.

如果我可以将它分成16个任务,并在16个Xeon CPU上运行,那么加入结果,这将是很棒的.

python parallel-processing permutation combinatorics

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

如何检查数字溢出而不在Python中收到警告?

我有一个表达式溢出为某些参数值.在这种情况下,我已经得出了使用笔和纸的渐近结果,当我有这样的情况时,我只用我的分析表达式替换.

目前我的代码做了这样的事情:

values = ExpressionThatOverFlows()
# Check the ones that overflow
indOverFlow = isnan(values)
# Set them to the values I derived by pen and paper
values[indOverFlow] = derivedValues
Run Code Online (Sandbox Code Playgroud)

我的问题是I/O爆炸了"警告".我知道它警告我很好,但我明确地照顾它,所以我想让它们沉默.请注意,我不想让所有类型的"溢出"警告静音,只有这里的警告.我认为像这样的东西会起作用,但它没有:

try:
   values = ExpressionThatOverFlows()
except Warning:
   pass
# and the rest of the code as it is
Run Code Online (Sandbox Code Playgroud)

我已经检查了一下,但我似乎只是找到了如何在整个会话或永远保持这些警告,但这是因为我指出的不是我想要的.

谢谢你的帮助,非常感谢.

编辑:这里有一个小得多的代码,产生我的问题:

from scipy import log1p, exp
from numpy import array, isnan

a = array([0.2222, 500.3, 0.3, 700.8, 0.111])

values = log1p(-exp(-exp(10**a - 9**a)))

print values # Note the nan's

indOverflow = …
Run Code Online (Sandbox Code Playgroud)

python numpy overflow

4
推荐指数
1
解决办法
2689
查看次数