[CPyUG]请教GUI和后端分离的问题

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

[CPyUG]请教GUI和后端分离的问题

Lerry-3
大家好,我最近在做一个P2P的程序,使用Python+PyQt,核心功能完成了一部分了,但是在和GUI整合时遇到了一些问题,希望大家指点一二。
我是先用Python实现核心功能,如加入P2P网络、查找节点、等等。然后 用PyQt做界面,但是我不知道如何将后端和GUI结合起来。后端是一个xml-rpc的服务端主循环,起了几个线程用来维护节点列表,和查找同网段节点。我希望后端能调用GUI的方法更新界面数据。也需要GUI能提交命令给后端。我想过几种办法:
  1. 单进程,把前后端写到一块,从PyQt起一个线程运行后端代码,这样好象比较乱,这时不是需要“线程间通信”?
  2. 分开成两个进程,我发现很多软件,迅雷、风行什么的都是两个进程,应该是一个后端负责通信和处理数据,一个负责和用户交互吧。但是进程之间如何通信,我觉得xml-rpc是最简单的。直接把通信用的方法放到原来的类里面吗,还是再弄个xml-rpc服务?
程序现在是在Debian下开发,最终要打包成exe,在windows下运行的,多进程会不会麻烦?
希望大家多多指教,谢谢!

--
yours,Lerry
--------------------------------------
Linuxer&Pythoner lerry.org


--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
Reply | Threaded
Open this post in threaded view
|

Re: [CPyUG]请教GUI和后端分离的问题

pansz-2
多进程如果是指反复启动和退出的进程,对 Windows
下是有性能问题的,但如果你是直接开两个进程一直保持,没有问题,Windows也就是开启进程的瞬间开销比较大一点。

一般我建议还是尽量少用线程,能用协程的用协程,能用进程的用进程,进程跟协程都不能满足需求的时候再考虑线程。

至于通讯,用什么方式都可以,后端程序外发消息可以用广播方式或者异步调用(就是说不等待前端响应)。前端可以主动请求数据,也允许等待返回。就这样。如果两者需要通讯,显然,双方都需要有能收发消息的主循环!如果后端用广播方式,那前端可以没有收消息循环,但还是得有监听广播的主循环。最好是这个循环能跟你的UI事件循环在一起――例如
Qt 如果收 dbus 消息,是可以在 Qt 的主循环里面直接收发的。

2011/12/30 Lerry <[hidden email]>:
> 程序现在是在Debian下开发,最终要打包成exe,在windows下运行的,多进程会不会麻烦?
> 希望大家多多指教,谢谢!

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
Reply | Threaded
Open this post in threaded view
|

Re: [CPyUG]请教GUI和后端分离的问题

Sparkle-2
In reply to this post by Lerry-3
索性做成client和daemon,可以linux跑daemon、window跑client更好了

于 2011/12/30 23:13, Lerry 写道:
大家好,我最近在做一个P2P的程序,使用Python+PyQt,核心功能完成了一部分了,但是在和GUI整合时遇到了一些问 题,希望大家指点一二。
我是先用Python实现核心功能,如加入P2P网络、查找节点、等等。然后 用PyQt做界面,但是我不知道如何将后端和GUI结合起来。后端是一个xml-rpc的服务端主循环,起了几个线程用来维护节点列表,和查找同网段节 点。我希望后端能调用GUI的方法更新界面数据。也需要GUI能提交命令给后端。我想过几种办法:
  1. 单进程,把前后端写到一块,从PyQt起一个线程运行后端代码,这样好象比较乱,这时不是需要“线程间通信”?
  2. 分开成两个进程,我发现很多软件,迅雷、风行什么的都是两个进程,应该是一个后端负责通信和处理数据,一个负责和用户交互 吧。但是进程之间如何通信,我觉得xml-rpc是最简单的。直接把通信用的方法放到原来的类里面吗,还是再弄个xml-rpc 服务?
程序现在是在Debian下开发,最终要打包成exe,在windows下运行的,多进程会不会麻烦?
希望大家多多指教,谢谢!

--
yours,Lerry
--------------------------------------
Linuxer&Pythoner lerry.org


--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
Reply | Threaded
Open this post in threaded view
|

Re: [CPyUG]请教GUI和后端分离的问题

Lerry-3
我打算用Queue试试

在 2011年12月31日 下午5:04,Sparkle <[hidden email]>写道:
索性做成client和daemon,可以linux跑daemon、window跑client更好了

于 2011/12/30 23:13, Lerry 写道:
大家好,我最近在做一个P2P的程序,使用Python+PyQt,核心功能完成了一部分了,但是在和GUI整合时遇到了一些问 题,希望大家指点一二。
我是先用Python实现核心功能,如加入P2P网络、查找节点、等等。然后 用PyQt做界面,但是我不知道如何将后端和GUI结合起来。后端是一个xml-rpc的服务端主循环,起了几个线程用来维护节点列表,和查找同网段节 点。我希望后端能调用GUI的方法更新界面数据。也需要GUI能提交命令给后端。我想过几种办法:
  1. 单进程,把前后端写到一块,从PyQt起一个线程运行后端代码,这样好象比较乱,这时不是需要“线程间通信”?
  2. 分开成两个进程,我发现很多软件,迅雷、风行什么的都是两个进程,应该是一个后端负责通信和处理数据,一个负责和用户交互 吧。但是进程之间如何通信,我觉得xml-rpc是最简单的。直接把通信用的方法放到原来的类里面吗,还是再弄个xml-rpc 服务?
程序现在是在Debian下开发,最终要打包成exe,在windows下运行的,多进程会不会麻烦?
希望大家多多指教,谢谢!

--
yours,Lerry
--------------------------------------
Linuxer&Pythoner lerry.org


--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html



--
yours,Lerry
--------------------------------------
Linuxer&Pythoner lerry.org


--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
Reply | Threaded
Open this post in threaded view
|

Re: [CPyUG]请教GUI和后端分离的问题

Goldfish Huang
In reply to this post by Lerry-3
第一种方案就可以了。起一个独立的线程负责PyQt和后端代码的通信。我这段代码对你或许会有用:


class PtrContainer:
    def __init__(self):
        self.ptrList=[]

    def append(self, ptr):
        for p in self.ptrList:
            if p is ptr:
                return
        ptr.setDoneCallback(self.remove)
        self.ptrList.append(ptr)

    def remove(self, ptr):
        i=0
        for p in self.ptrList:
            if p is ptr:
                self.ptrList.pop(i)
                return
            i+=1

    def clear(self):
        self.ptrList=[]

    def __iter__(self):
        return self.ptrList.__iter__()

class Ptr:
    def setDoneCallback(self, callback):
        self._doneCallback=callback

    def done(self):
        #原本要判断一下有没有_doneCallback这个属性的。但是其实没有必要,因为这种情况肯定是编程错误
        #self._doneCallback=None也必定是编程错误
#        if not hasattr(self, "_doneCallback") or self._doneCallback is None:
#            return
        self._doneCallback(self)

class DeferCallThread(Ptr, QThread):
    def __init__(self, deferred, func, args, kwargs):
        QThread.__init__(self)
        self.func=func
        self.deferred=deferred
        self.args=args
        self.kwargs=kwargs
        self.finished.connect(self.done)

    def run(self):
        try:
            result=self.func(*(self.args), **(self.kwargs))
        except Exception as e:
            print("deferCall caught exception", repr(e))
            QMetaObject.invokeMethod(self, "callDeferred", Qt.QueuedConnection,
                    Q_ARG("bool", True), Q_ARG("PyQt_PyObject", e))
        else:
            QMetaObject.invokeMethod(self, "callDeferred", Qt.QueuedConnection,
                    Q_ARG("bool", False), Q_ARG("PyQt_PyObject", result))

    @pyqtSlot("bool", "PyQt_PyObject")
    def callDeferred(self, errorOccured, result):
        if errorOccured:
            self.deferred.errback(result)
        else:
            self.deferred.callback(result)

deferCallThreads=PtrContainer()

def deferCall(func, *args, **kwargs):
    df=Deferred()
    t=DeferCallThread(df, func, args, kwargs)
    deferCallThreads.append(t)
    t.start()
    return df

在 2011年12月30日 下午11:13,Lerry <[hidden email]> 写道:

> 大家好,我最近在做一个P2P的程序,使用Python+PyQt,核心功能完成了一部分了,但是在和GUI整合时遇到了一些问题,希望大家指点一二。
> 我是先用Python实现核心功能,如加入P2P网络、查找节点、等等。然后
> 用PyQt做界面,但是我不知道如何将后端和GUI结合起来。后端是一个xml-rpc的服务端主循环,起了几个线程用来维护节点列表,和查找同网段节点。我希望后端能调用GUI的方法更新界面数据。也需要GUI能提交命令给后端。我想过几种办法:
>
> 单进程,把前后端写到一块,从PyQt起一个线程运行后端代码,这样好象比较乱,这时不是需要“线程间通信”?
> 分开成两个进程,我发现很多软件,迅雷、风行什么的都是两个进程,应该是一个后端负责通信和处理数据,一个负责和用户交互吧。但是进程之间如何通信,我觉得xml-rpc是最简单的。直接把通信用的方法放到原来的类里面吗,还是再弄个xml-rpc服务?
>
> 程序现在是在Debian下开发,最终要打包成exe,在windows下运行的,多进程会不会麻烦?
> 希望大家多多指教,谢谢!
>
> --
> yours,Lerry
> --------------------------------------
> Linuxer&Pythoner lerry.org
>
>
> --
> 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 发言: [hidden email]
> 退订: [hidden email] (向此发空信即退!)
> 详情: http://code.google.com/p/cpyug/wiki/PythonCn
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> 强烈: 建议使用技巧: 如何有效地报告Bug
> http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html



--
企业聊天软件:http://besteam.im/

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html