代码之家  ›  专栏  ›  技术社区  ›  Hojo.Timberwolf

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

  •  0
  • Hojo.Timberwolf  · 技术社区  · 8 年前

    在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()
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Druta Ruslan    8 年前

    你的 process 需要从大写开始 Process docs

    import multiprocessing as mp
    
    runRecord = mp.Process(target=mycam.RecordVideo())
    ...
    

    更新

    差异 mp.process mp.Process 那是

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