小编pie*_*ate的帖子

使用subprocess.Popen将大量数据传递给stdin

我有点难以理解解决这个简单问题的python方法是什么.

我的问题很简单.如果您使用以下代码,它将挂起.这在子流程模块doc中有详细记载.

import subprocess

proc = subprocess.Popen(['cat','-'],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        )
for i in range(100000):
    proc.stdin.write('%d\n' % i)
output = proc.communicate()[0]
print output
Run Code Online (Sandbox Code Playgroud)

寻找一个解决方案(有一个非常有洞察力的线程,但我现在已经丢失了)我发现这个解决方案(以及其他)使用了一个显式的fork:

import os
import sys
from subprocess import Popen, PIPE

def produce(to_sed):
    for i in range(100000):
        to_sed.write("%d\n" % i)
        to_sed.flush()
    #this would happen implicitly, anyway, but is here for the example
    to_sed.close()

def consume(from_sed):
    while 1:
        res = from_sed.readline()
        if not res:
            sys.exit(0)
            #sys.exit(proc.poll())
        print 'received: ', [res]

def main():
    proc = Popen(['cat','-'],stdin=PIPE,stdout=PIPE)
    to_sed = proc.stdin
    from_sed = …
Run Code Online (Sandbox Code Playgroud)

python subprocess popen

15
推荐指数
2
解决办法
1万
查看次数

类型错误:AutoProxy 对象不可迭代 - 多处理

考虑以下服务器代码:

from multiprocessing.managers import BaseManager, BaseProxy

def baz(aa) :
    print "aaa"
    l = []
    for i in range(3) :
      l.append(aa)
    return l

class SolverManager(BaseManager): pass

manager = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
manager.register('solver', baz)

server = manager.get_server()
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

和相关的客户:

import sys
from multiprocessing.managers import BaseManager, BaseProxy

class SolverManager(BaseManager): pass

def main(args) :
    SolverManager.register('solver')
    m = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
    m.connect()

    for i in m.solver(args[1]):
        print i

if __name__ == '__main__':
    sys.exit(main(sys.argv))
Run Code Online (Sandbox Code Playgroud)

我想我在这里遗漏了一些重要的东西。我的猜测是我必须对 BaseProxy 类进行子类化以提供一个可迭代对象,但到目前为止我还没有设法做到正确。

当我运行客户端时,出现此错误:

Traceback (most recent call last):
  File "mpmproxy.py", line …
Run Code Online (Sandbox Code Playgroud)

python proxy autoproxy multiprocessing

6
推荐指数
1
解决办法
2960
查看次数

使用multiprocessing.Managers构建一个简单的远程调度程序

请考虑以下代码:

服务器:

import sys
from multiprocessing.managers import BaseManager, BaseProxy, Process

def baz(aa) :
    l = []
    for i in range(3) :
      l.append(aa)
    return l

class SolverManager(BaseManager): pass

class MyProxy(BaseProxy): pass

manager = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
manager.register('solver', callable=baz, proxytype=MyProxy)

def serve_forever(server):
    try :
        server.serve_forever()
    except KeyboardInterrupt:
        pass

def runpool(n):
    server = manager.get_server()
    workers = []

    for i in range(int(n)):
        Process(target=serve_forever, args=(server,)).start()

if __name__ == '__main__':
    runpool(sys.argv[1])
Run Code Online (Sandbox Code Playgroud)

客户:

import sys
from multiprocessing.managers import BaseManager, BaseProxy

import multiprocessing, logging

class SolverManager(BaseManager): pass

class …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

5
推荐指数
1
解决办法
1625
查看次数

标签 统计

python ×3

multiprocessing ×2

autoproxy ×1

popen ×1

proxy ×1

subprocess ×1