我需要帮助在我的代码中应用多处理。我尝试阅读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)
提前再次感谢!我确定如果我理解如何为这一个脚本做到这一点,我可能会弄清楚如何将它应用到其他脚本。
答案 0 :(得分:0)
多处理有点令人生畏。要理解的关键是,当其他进程正在使用资源(读取或写入)时,您不需要使用资源的多个进程(例如,写入引用)。
因此,对于理想的多处理设置,您希望每个进程仅对其单独使用的资源起作用。
因此,当多个进程在不同的资源上工作时,可以有效地使用python中的多处理; 2)您的硬件上有多个处理器,或者多个进程可以在一个(或多个)上相互交换)等待事件发生时的处理器机器。
我建议您尝试使用符合上述条件的“一些玩具”,以了解它的工作方式和位置。然后重新审视您的问题,并尝试以与python多处理工作方式一致的方式实现它。
彻底阅读文档。有一个join()函数,您可能需要确保所有进程在下一步可能完成之前完成,即使下一步只是终止程序。