DummerSM 发表于 2023-6-3 21:16:51

请问python同一个项目的两个类之间和不同项目的进程之间如何通讯

我需要完成一个比较复杂的信号传递。
在项目1的main.py里,我需要在main.py运行之后,项目1的logger_send.py里面的sender类也同步运行,并且main.py需要发送列表形式的信号比如["info","程序启动"],然后logger_send.py的sender类接受到这个["info","程序启动"]信号之后,
发送给项目2的logger.py[这个py程序一直在作为独立进程运行],然后项目2的logger.py执行对应的操作[比如生成一个log文件]
=====================
其实简言之就是一个项目的mian主程序启动这个项目下的一个sender类,并且可以向其传递参数,在sender类收到这个函数之后连接到有写入log文件的进程,并把参数传递给这个进程
能够达到这个功能就行,也不一定必须要sender类一直运行,sender也可以是一个模块

isdkz 发表于 2023-6-3 21:17:26

可以使用Python内置的multiprocessing模块来实现不同进程之间的通信。具体实现可以按照以下步骤进行:

1. 在项目1的main.py中,启动一个子进程,运行logger_send.py中的sender类。可以使用multiprocessing.Process来创建子进程,将sender类作为参数传入。例如:

import multiprocessing
from logger_send import sender

if __name__ == '__main__':
    p = multiprocessing.Process(target=sender)
    p.start()


2. 在main.py中,使用multiprocessing.Queue来创建一个队列,将需要发送的信号放入队列中。例如:

from multiprocessing import Queue

signal_queue = Queue()
signal_queue.put(["info", "程序启动"])


3. 在sender类中,使用multiprocessing.Pipe来创建一个管道,连接到项目2的logger.py进程。例如:

from multiprocessing import Pipe

conn1, conn2 = Pipe()


4. 在sender类中,使用multiprocessing.Queue.get方法从队列中获取信号,然后使用conn2.send方法将信号发送到logger.py进程。例如:

signal = signal_queue.get()
conn2.send(signal)


5. 在logger.py中,使用conn1.recv方法从管道中接收信号,然后执行相应的操作。例如:

signal = conn1.recv()
if signal == "info":
    # 执行生成log文件的操作


通过这种方式,可以实现不同进程之间的通信,并且可以在不同项目之间传递数据。

陶远航 发表于 2023-6-3 21:21:29

你可以在项目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)

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进程收到参数后会生成对应的日志文件。

DummerSM 发表于 2023-6-3 22:01:44

陶远航 发表于 2023-6-3 21:21
你可以在项目1的main.py中使用multiprocessing模块来启动一个新进程,并将需要传递的参数作为参数传给该进 ...

太感谢了,那么细心回复,我一会试试,谢谢

陶远航 发表于 2023-6-3 22:02:16

DummerSM 发表于 2023-6-3 22:01
太感谢了,那么细心回复,我一会试试,谢谢

好好

DummerSM 发表于 2023-6-3 22:02:22

isdkz 发表于 2023-6-3 21:17
可以使用Python内置的multiprocessing模块来实现不同进程之间的通信。具体实现可以按照以下步骤进行:

1....

万分感谢!那么细心回复,我一会试试,谢谢

DummerSM 发表于 2023-6-3 22:36:21

isdkz 发表于 2023-6-3 21:17
可以使用Python内置的multiprocessing模块来实现不同进程之间的通信。具体实现可以按照以下步骤进行:

1....

你好
请问是否可以添加一下您的QQ,对于这个参数的传递我还是有点问题,可否指教

DummerSM 发表于 2023-6-3 22:36:53

isdkz 发表于 2023-6-3 21:17
可以使用Python内置的multiprocessing模块来实现不同进程之间的通信。具体实现可以按照以下步骤进行:

1....

2629895779

isdkz 发表于 2023-6-3 22:49:30

DummerSM 发表于 2023-6-3 22:36
2629895779

加你了

DummerSM 发表于 2023-6-4 09:30:47

现在的问题是,我可能需要pywin32来创建命名管道,请问该怎么操作
页: [1]
查看完整版本: 请问python同一个项目的两个类之间和不同项目的进程之间如何通讯