异步检索进程中的信息

时间:2012-02-03 23:48:40

标签: python asynchronous multiprocessing python-2.7

这是我想要做的伪代码。

import time

def run():

    while x < 10000000:
        x += 1

if __name__ == "__main__":

    p = Process(run)
    p.start()

    time.sleep(3)

    #some code that I don't know that will give me the current value of x

Pythons threading模块似乎是要走的路,但是我还没有成功实现这个例子。

3 个答案:

答案 0 :(得分:0)

您需要的一切都在multiprocessing module中。也许shared memory对象在这里会有所帮助吗?

请注意,Python中的线程受Global Interpreter Lock的影响,这实际上会阻止多线程Python代码。

答案 1 :(得分:0)

好吧,这是

from multiprocessing import Process, Pipe
import time

def f(conn):
    x = 0
    while x < 10000000:
        if conn.poll():
            if conn.recv() == "get":
                conn.send(x)

        x += 1

    conn.close()

if __name__ == '__main__':

    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()

    time.sleep(2)
    parent_conn.send("get")
    print(parent_conn.recv())

    p.join()

原来是duplicate,我的版本更通用。

答案 2 :(得分:0)

这实际上取决于您尝试完成的内容以及子进程的创建和内存使用频率。一些长寿命的,您可以轻松地使用多个操作系统级进程(参见subprocess模块`)。如果你正在产生很多小东西,那么线程化速度更快,内存开销也更少。但是通过线程,你会遇到诸如线程安全&#34;,全局解释器锁以及信号量和死锁等令人讨厌的无聊事物之类的问题。

两个进程或线程之间的数据共享策略大致可分为两类:&#34;让我们共享一块内存&#34; (使用LockMutex es)和&#34;让我们共享数据副本&#34; (使用消息传递,管道或socket)。共享方法内存很少,但难以管理,因为这意味着确保一个线程不会读取共享内存的相同部分,因为另一个线程正在写入它,这不是一件容易的事,也很难调试。复制方法在内存上更重,但更容易理解。此外,它具有明显的优势,能够非常简单地移植到网络,允许分布式计算。

您还必须考虑底层操作系统。我不知道具体细节,但有些人在不同的方法上比其他人更好。

我说从RabbitMQ开始。