你可以在项目1的main.py中使用multiprocessing模块来启动一个新进程,并将需要传递的参数作为参数传给该进程。如下所示:
import multiprocessing
from logger_send import Sender
if __name__ == '__main__':
signal = ["info", "程序启动"]
sender_process = multiprocessing.Process(target=Sender, args=(signal,))
sender_process.start()
在上述代码中,我们首先导入了multiprocessing模块和Sender类,然后在if __name__ == '__main__':语句块中创建了一个名为signal的列表,里面存储了需要传递的参数。接下来,我们利用multiprocessing.Process函数创建了一个新的进程,并在其中运行Sender类,同时将signal作为参数传递给该进程。
在项目1的logger_send.py文件中,我们定义了Sender类来读取并发送传递过来的信号。具体实现如下:
import time
from multiprocessing.connection import Client
class Sender:
def __init__(self, signal):
self.signal = signal
def send_signal(self):
address = ('localhost', 6000) # 指定log进程的地址和端口号
with Client(address, authkey=b'secret password') as conn:
conn.send(self.signal)
conn.close()
if __name__ == '__main__':
sender = Sender(signal)
sender.send_signal()
在上述代码中,我们首先导入了time模块和multiprocessing.connection.Client类,然后定义了Sender类来读取并发送传递过来的信号。在__init__函数中,我们初始化了一个名为signal的实例变量,该变量存储了从主进程中传递过来的参数。接下来,在send_signal函数中,我们指定了log进程的地址和端口号(在此处假设为localhost:6000),并利用multiprocessing.connection.Client类建立了一个连接。然后,我们将信号发送给log进程,并关闭连接。
在项目2的logger.py文件中,我们需要先启动log进程,然后在其中定义一个Receiver类来接受并处理从main进程发来的信号。具体实现如下:
import logging
from multiprocessing import Process, connection
class Receiver:
def __init__(self):
self.listener = connection.Listener(('localhost', 6000), authkey=b'secret password')
def start(self):
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
file_handler = logging.FileHandler('my.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
while True:
conn = self.listener.accept()
signal = conn.recv()
conn.close()
logger.info(signal[1])
if __name__ == '__main__':
receiver = Receiver()
receiver.start()
在上述代码中,我们首先导入了logging模块和multiprocessing.Process、multiprocessing.connection模块中的Listener和connection类。然后,在Receiver类中,我们初始化了一个名为listener的实例变量,该变量用于监听连接到log进程的sender进程。在start函数中,我们首先配置了logger对象,指定了日志级别、格式和输出文件。接下来,我们使用一个无限循环来不断接受从sender进程传递过来的信号,并将其存储到signal变量中。最后,我们利用logger对象记录日志。
在项目2的main.py文件中,我们可以直接调用logging模块来记录日志,例如:
import logging
if __name__ == '__main__':
logging.info('程序启动')
这样一来,当我们运行项目1的main.py时,会自动启动一个新的sender进程,并将参数传递给log进程,log进程收到参数后会生成对应的日志文件。 |