如何在主进程中的 "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()
我想创建人脸检测代码,当它在视频源中检测到人脸时会发送一封电子邮件。电子邮件功能需要在后台 运行,而主要功能检测人脸。
在处理面部检测之前,我尝试在后台将电子邮件功能设为 运行(在保存图像功能将图像传递到电子邮件之后)。当我 运行 代码时,我得到 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()