鱼C论坛

 找回密码
 立即注册
查看: 1795|回复: 9

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

[复制链接]
发表于 2023-6-3 21:16:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我需要完成一个比较复杂的信号传递。
在项目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也可以是一个模块
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

1. 在项目1的main.py中,启动一个子进程,运行logger_send.py中的sender类。可以使用multiprocessing.Process来创建子进程,将sender类作为参数传入。例如:
import multiprocessingfrom logger_send import senderif __name__ == '__main__':    p = multiprocessing.Process(target=sender)    p.start()
2. 在main.py中,使用multiprocessing.Queue来创建一个队列,将需要发送的信号放入队列中。例如:
from multiprocessing import Queuesignal_queue = Queue()signal_queue.put(["info", "程序启动"])
3. 在sender类中,使用multiprocessing.Pipe来创建一个管道,连接到项目2的logger.py进程。例如:
from multiprocessing import Pipeconn1, 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[0] == "info":    # 执行生成log文件的操作
通过这种方式,可以实现不同进程之间的通信,并且可以在不同项目之间传递数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[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进程收到参数后会生成对应的日志文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

太感谢了,那么细心回复,我一会试试,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-3 22:02:16 | 显示全部楼层
DummerSM 发表于 2023-6-3 22:01
太感谢了,那么细心回复,我一会试试,谢谢

好好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

1.  ...

万分感谢!那么细心回复,我一会试试,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

1.  ...

你好
请问是否可以添加一下您的QQ,对于这个参数的传递我还是有点问题,可否指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-3 22:36:53 | 显示全部楼层
isdkz 发表于 2023-6-3 21:17
可以使用Python内置的multiprocessing模块来实现不同进程之间的通信。具体实现可以按照以下步骤进行:

1.  ...

2629895779
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-3 22:49:30 | 显示全部楼层

加你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-4 09:30:47 | 显示全部楼层
现在的问题是,我可能需要pywin32来创建命名管道,请问该怎么操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 10:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表