我有一个小程序,当我通过python2.7中的zerorpc
模块调用它时,它在后台进行一些计算。在
这是我的代码:
is_busy = False
class Server(object):
def calculateSomeStuff(self):
global is_busy
if (is_busy):
return 'I am busy!'
is_busy = True
# calculate some stuff
is_busy = False
print 'Done!'
return
def getIsBusy(self):
return is_busy
s = zerorpc.Server(Server())
s.bind("tcp://0.0.0.0:66666")
s.run()
当我调用.getIsBusy()
方法时,在.calculateSomeStuff()
开始执行它的工作后,我应该更改什么来使这个程序返回is_busy
?在
正如我所知,在python2中没有办法使它异步。在
您需要多线程来实现真正的并发,如果这是您所追求的,则需要利用多个CPU核心。请参阅Python线程模块,
GIL
-lock详细信息以及可能的解决方法和文献。在如果你想要一个合作的解决方案,继续读下去。在
zerorpc
使用gevent
进行异步输入/输出。使用gevent
编写协同程序(也称为greenlet或userland线程),它们都在单个线程上协同运行。运行gevent
输入输出循环的线程。gevent
ioloop
负责恢复等待某些I/O事件的协同进程。在这里的关键是合作。将其与运行在单个CPU/核心计算机上的线程进行比较。实际上不存在并发,
但操作系统将抢占(动词): 采取措施以防止(一个预期的事件)发生。一个正在运行的线程执行下一个线程,以此类推,这样每个线程都有机会向前迈进。在
这种情况发生得足够快,以至于感觉所有线程都在同时运行。在
如果您与
gevent
输入/输出循环合作编写代码,那么您可以通过谨慎地调用gevent.sleep(0)
来达到相同的效果,以便给gevent
ioloop
运行其他协程。在它实际上是合作的多层次。我听说在Windows2或者别的什么地方是这样的。在
所以,在你的例子中,在繁重的计算部分,你可能有一些循环正在进行。请确保每秒调用
gevent.sleep(0)
几次,这样就会产生多线程的错觉。在我希望我的回答不会太混乱。在
相关问题 更多 >
编程相关推荐