|
大家好,我最近在做一个P2P的程序,使用Python+PyQt,核心功能完成了一部分了,但是在和GUI整合时遇到了一些问题,希望大家指点一二。 我是先用Python实现核心功能,如加入P2P网络、查找节点、等等。然后 用PyQt做界面,但是我不知道如何将后端和GUI结合起来。后端是一个xml-rpc的服务端主循环,起了几个线程用来维护节点列表,和查找同网段节点。我希望后端能调用GUI的方法更新界面数据。也需要GUI能提交命令给后端。我想过几种办法:
程序现在是在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 |
|
多进程如果是指反复启动和退出的进程,对 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 |
|
In reply to this post by Lerry-3
索性做成client和daemon,可以linux跑daemon、window跑client更好了
于 2011/12/30 23:13, Lerry 写道:
-- 来自: 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 |
|
我打算用Queue试试
在 2011年12月31日 下午5:04,Sparkle <[hidden email]>写道:
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 |
|
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 |
| Powered by Nabble | See how NAML generates this page |
