在RPi上编程并尝试利用线程来充分利用小型系统。但一个问题是RPi只有一个四核和一个RAM的演出,这意味着内存管理是必须的。最初打算尝试将不同的函数分离到不同的线程中;阅读有关线程的注释对于我当前的水平来说听起来很复杂。
决定在需要执行进程时让一个主线程创建较小的线程。问题是我很快就遇到了错误。
Exception in thread Thread-5:
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
runRecord = mp.process(target=mycam.RecordVideo())
TypeError: 'module' object is not callable
作为解决方案,我想到了主线程创建第二个线程,线程完成后,关闭线程并启动下一个线程。我不知道最好的方法。闭合线程是否可以在变量终止之前填充变量或传递变量?
runRecord = mp.process(target=mycam.RecordVideo())
runRecord.start()
completed = runRecord.join() ???
代码以供参考,因为它可能是那里的问题。这就是导致上述问题的原因
class myCamrecord():
# setup camera for threading
def __init__(self, filename, resolution=(1280,720), framerate=45, RecLength=5):
self.camera = PiCamera()
# setup pi module for recording
self.filename = filename
self.camera.resolution = resolution
self.camera.framerate = framerate
self.camera.hflip = "yes"
self.camera.vflip = "yes"
self.Recordlenength = RecLength
print("Initialized Threading")
# allow the camera to warmup
time.sleep(1.0)
def RecordVideo(self):
self.camera.start_recording(self.filename, format='h264')
# start recording
self.camera.wait_recording(self.Recordlenength)
# wait X amount of time
self.camera.stop_recording()
# stop recording
print("done Recording")
self.TrData = TransferData(self.filename)
self.TrData.Openport()
self.camera.close()
# close camera module
class TransferData():
def __init__(self,filename):
self.filename = filename
self.NextFun = "EOF"
self.AckFl = "ACK"
#Initialize the client socket for file transfer system
self.TransferSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.server = ('192.168.1.117',5650) # 'host static ip'
self.TransferSocket.connect(self.server)
print("Connected to:",self.server)
def Openport(self):
print("Start Transfer")
f = open(self.filename,"rb")
FName = self.filename # Put is a server side command to place file somewhere on computer
self.TransferSocket.send(FName.encode()) # send file name over to computer
chunk = f.read(1024) # start pulling chunks from file to send
while(chunk): # Loop while data is available in file
self.TransferSocket.send(chunk) # Send chunk from file
if self.TransferSocket.recv(1024) != self.AckFl.encode(): # If package was not received, confirmation is receiving 'ACK', print below
print("Failed transfer")
chunk = f.read(1024) # Grab next chunk from file for sending
f.close() # Close file after sending all chunks
self.TransferSocket.send(self.NextFun.encode())
filename = str(time.strftime('%Y%m%d-%H-%M-%S')) +".h264"
print("Record")
mycam = myCamrecord(filename)
runRecord = mp.process(target=mycam.RecordVideo())
runRecord.start()
runRecord.join()
您的process
需要从大写Process
文档开始
import multiprocessing as mp
runRecord = mp.Process(target=mycam.RecordVideo())
...
更新
mp.process
和mp.Process
之间的区别在于
mp.process # is module
mp.Process # is a Class