在线程关闭 python 之后返回一个参数



在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.processmp.Process之间的区别在于

mp.process # is module
mp.Process # is a Class

最新更新