在线程结束后返回参数

2024-06-26 04:45:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在RPi上编程,并尝试利用线程来充分利用小型系统。然而,一个问题是RPi只有一个四核和一个gig的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()

Tags: toselfsendsocketfilename线程startfile
1条回答
网友
1楼 · 发布于 2024-06-26 04:45:45

您的process需要以大写Processdocs开头

import multiprocessing as mp

runRecord = mp.Process(target=mycam.RecordVideo())
...

更新

{}和{}之间的区别是

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

相关问题 更多 >