如何在我的Python代码中应用多处理?

时间:2014-02-13 00:31:07

标签: python multiprocessing

我需要帮助在我的代码中应用多处理。我尝试阅读Python文档的多处理部分,但我不知道如何将它应用到我拥有的内容中。我相信我想要使用的是Pool。下面是我编写的一个python脚本的一部分,最终将被调用到另一个主脚本:

## servoRemote.py

from franges import drange
from cmath import sqrt as csqrt
from math import atan, degrees, radians, tan, sqrt, floor
import servo

# Declare variables for servo conditional statements:
UR = False
UL = False
BR = False
BL = False

def servoControl(x,y):
    global UR, UL, BR, BL
    ytop = round((-csqrt((0.3688**2)*(1-((x-0.5)**2)/(0.2067**2)))+0.5).real,3)
    ybottom = round((csqrt((0.3688**2)*(1-((x-0.5)**2)/(0.2067**2)))+0.5).real,3)

    if (x in list(drange(0.5,0.708,0.001,3)) and y in list(drange(ytop,0.501,0.001,3))):
        UR = True
        UL = False
        BR = False
        BL = False
        (factor, angle) = linearSF(x,y)
        (servo1, servo2) = angleSF(factor,angle)
        servo.move(1,servo1)
        servo.move(2,servo2)

def linearSF(r,s):
    # Calculates the hypotenuse of the gaze:
    distr = abs(r-0.4999)
    dists = abs(0.50-s)
    theta = atan(dists/distr)
    b = sqrt(distr**2+dists**2)

    # Involved in solving for max x coordinate:
    A = 1+0.31412198*tan(theta)**2
    B = (-1-0.31412198*tan(theta)**2)**2 - 4*(1+(tan(theta)**2)/3.183477)*(0.207275+0.0785305*tan(theta)**2)
    B = csqrt(B)
    C = 2+((2*tan(theta)**2)/3.183477)

    # Different x equations:
    xRight = ((A+B)/C).real
    xLeft = ((A-B)/C).real

    if (UR == True and UL == False and BR == False and BL == False):
        x = xRight
        y = -sqrt((0.3688**2)*(1-((x-0.5)**2)/(0.2067**2)))+0.5
    # Solve for max hypotenuse given an angle, a:
    a = sqrt(abs(x-0.5)**2+abs(0.5-y)**2)
    # Final outputs, factor and angle (in degrees):
    factor = (b/float(a))
    angle = degrees(theta)
    return (factor, angle)

def angleSF(factor, angle):
    # Angular factors:
    S1U = -0.0025641026*angle + 1.230759
    S2R = 0.0025641026*angle + 1
    if (UR == True and UL == False and BR == False and BL == False):
        servo1 = int(floor((S1U*65-78)*factor + 78))
        servo2 = int(floor((S2R*65-78)*factor + 78))
    return (servo1,servo2)

以上代码仅适用于UR == True的情况。还有其他条件if语句遵循不同的条件。我发现使用多进程的大多数示例都使用有限for循环,但我想暂时将其放入:

while 1:
    x = [some continuously incoming data stream]
    y = [some continuously incoming data stream]
    servoControl(x,y)

提前再次感谢!我确定如果我理解如何为这一个脚本做到这一点,我可能会弄清楚如何将它应用到其他脚本。

1 个答案:

答案 0 :(得分:0)

多处理有点令人生畏。要理解的关键是,当其他进程正在使用资源(读取或写入)时,您不需要使用资源的多个进程(例如,写入引用)。

因此,对于理想的多处理设置,您希望每个进程仅对其单独使用的资源起作用。

因此,当多个进程在不同的资源上工作时,可以有效地使用python中的多处理; 2)您的硬件上有多个处理器,或者多个进程可以在一个(或多个)上相互交换)等待事件发生时的处理器机器。

我建议您尝试使用符合上述条件的“一些玩具”,以了解它的工作方式和位置。然后重新审视您的问题,并尝试以与python多处理工作方式一致的方式实现它。

彻底阅读文档。有一个join()函数,您可能需要确保所有进程在下一步可能完成之前完成,即使下一步只是终止程序。