如何使用zeromq和threading或async处理对python程序的多个请求?

2024-06-02 06:59:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小程序,当我通过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中没有办法使它异步。在


Tags: 模块代码self程序falsereturnserveris
1条回答
网友
1楼 · 发布于 2024-06-02 06:59:27

您需要多线程来实现真正的并发,如果这是您所追求的,则需要利用多个CPU核心。请参阅Python线程模块,GIL-lock详细信息以及可能的解决方法和文献。在

如果你想要一个合作的解决方案,继续读下去。在

zerorpc使用gevent进行异步输入/输出。使用gevent编写协同程序(也称为greenlet或userland线程),它们都在单个线程上协同运行。运行gevent输入输出循环的线程。geventioloop负责恢复等待某些I/O事件的协同进程。在

这里的关键是合作。将其与运行在单个CPU/核心计算机上的线程进行比较。实际上不存在并发,
但操作系统将抢占动词): 采取措施以防止(一个预期的事件)发生。一个正在运行的线程执行下一个线程,以此类推,这样每个线程都有机会向前迈进。在

这种情况发生得足够快,以至于感觉所有线程都在同时运行。在

如果您与gevent输入/输出循环合作编写代码,那么您可以通过谨慎地调用gevent.sleep(0)来达到相同的效果,以便给geventioloop运行其他协程。在

它实际上是合作的多层次。我听说在Windows2或者别的什么地方是这样的。在

所以,在你的例子中,在繁重的计算部分,你可能有一些循环正在进行。请确保每秒调用gevent.sleep(0)几次,这样就会产生多线程的错觉。在

我希望我的回答不会太混乱。在

相关问题 更多 >