如何在主进程中的 "while loop" 中 运行 附加进程

How to run an additional process in a "while loop" within the Main process

我想创建人脸检测代码,当它在视频源中检测到人脸时会发送一封电子邮件。电子邮件功能需要在后台 运行,而主要功能检测人脸。

在处理面部检测之前,我尝试在后台将电子邮件功能设为 运行(在保存图像功能将图像传递到电子邮件之后)。当我 运行 代码时,我得到 2 个断言错误:

AssertionError: can only start a process object created by current process

AssertionError: cannot start a process twice

这是我的代码(减去 gmail 登录)...

import face_recognition
import cv2
import numpy as np
import time
import datetime

import multiprocessing
import os

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

def send_email():
    email_user = 'xxxxx@gmail.com'
    email_password = 'xxxxxxxxxxxx'
    email_send = 'xxxxxxx@gmail.com'

    subject = 'Surveillance Project'

    msg = MIMEMultipart()
    msg['From'] = email_user
    msg['To'] = email_send
    msg['Subject'] = subject

    body = 'Hi there, sending this email from Python!'
    msg.attach(MIMEText(body,'plain'))

    filename='joe.jpg'
    print("[INFO] - " + str(datetime.datetime.now()) + " - Image name - " + filename)
    attachment  =open(filename,'rb')

    # create the attachment
    part = MIMEBase('application','octet-stream')
    part.set_payload((attachment).read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition',"attachment; filename= "+filename)
    print("[INFO] - " + str(datetime.datetime.now()) + " - Attachment Created")

    # set up connection
    print("[INFO] - " + str(datetime.datetime.now()) + " - Creating Email to Send")
    msg.attach(part)
    text = msg.as_string()
    print("[INFO] - " + str(datetime.datetime.now()) + " - Setting up connection")
    server = smtplib.SMTP('smtp.gmail.com',587)
    server.starttls()
    server.login(email_user,email_password)

    # send email
    print("[INFO] - " + str(datetime.datetime.now()) + " - Email SENDING" )
    server.sendmail(email_user,email_send,text)
    server.quit()
    print("[INFO] - " + str(datetime.datetime.now()) + " - Email SENT" )

def save_image():
    p1.start()
    print("ID of process p1: {}".format(p1.pid))
    p1.join()
    send_email()

def Main():
    # process IDs
    for i in range(30):
        print(i)
        if i % 10 == 0:
            print("[INFO] - " + str(datetime.datetime.now()) + " - Email initated...")
            save_image()

        # Hit 'q' on the keyboard to quit!
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

if __name__ == "__main__":
    # printing main program process id
    print("ID of main process: {}".format(os.getpid()))
    p1 = multiprocessing.Process(target=send_email)
    Main()

您正在启动一个子进程 p1,然后不止一次启动它。还有你运行send_email两次...

考虑这段代码:

import multiprocessing
import os

def send_email():
    print("send email")

def main():
    for i in range(30):
        if i % 10 == 0:
            p = multiprocessing.Process(target=send_email)
            p.start()
            print("ID of process p: {}".format(p.pid))
            p.join()

if __name__ == "__main__":
    print("ID of main process: {}".format(os.getpid()))
    main()