2024-04-18 17:53:39 发布
网友
我正在寻找一种方法来实现这一点,以便可以将其传递到另一个子进程的环境中。在
不幸的是,一旦子进程退出,它的环境就会消失,即使使用/proc filesystem on Unix特殊文件/proc/[pid]/environ,它也不会反映子进程所做的更改。在
/proc/[pid]/environ
即使上面的方法有效,你也会有一个竞争条件:家长需要确定“正确的时间”来阅读环境,最好是在孩子修改环境之后。要做到这一点,家长需要与孩子协调,只要你在协调,你也可以明确地交流。在
您需要通过套接字、管道、共享内存等在父对象和子对象之间传递状态。multiprocessing module可以使这一点更简单,允许您通过队列或管道将数据从子对象传递到父对象。在
更新了下面是一个使用multiprocessing模块让父进程与子进程共享值,并让子进程在队列中彼此通信的一个快速示意图。它使它变得非常简单:
multiprocessing
import os from multiprocessing import Process, Manager, Queue def worker1(d, q): # receive value from worker2 msg = q.get() d['value'] += 1 d['worker1'] = os.getpid(), msg def worker2(d, q): # send value to worker1 q.put('hi from worker2') d['value'] += 1 d['worker2'] = os.getpid() if __name__ == '__main__': mgr = Manager() d = mgr.dict() q = Queue() d['value'] = 1 p1 = Process(target=worker1, args=(d,q)) p1.start() p2 = Process(target=worker2, args=(d,q)) p2.start() p1.join() p2.join() print d
结果:
下面是一个简单的函数,它在子进程中运行命令,然后将其环境提取到当前进程中。在
它基于Fnord的版本,没有tempfile,并且有一个标记行来区分SET命令和进程本身的任何输出。它不是防弹的,但它对我有用。在
def setenv(cmd): cmd = cmd + ' && echo ~~~~START_ENVIRONMENT_HERE~~~~ && set' env = (subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) .stdout .read() .decode('utf-8') .splitlines()) record = False for e in env: if record: e = e.strip().split('=') os.environ[e[0]] = e[1] elif e.strip() == '~~~~START_ENVIRONMENT_HERE~~~~': record = True
你能在第一个子进程中打印出来并用python处理这个字符串吗?在
不幸的是,一旦子进程退出,它的环境就会消失,即使使用/proc filesystem on Unix特殊文件
/proc/[pid]/environ
,它也不会反映子进程所做的更改。在即使上面的方法有效,你也会有一个竞争条件:家长需要确定“正确的时间”来阅读环境,最好是在孩子修改环境之后。要做到这一点,家长需要与孩子协调,只要你在协调,你也可以明确地交流。在
您需要通过套接字、管道、共享内存等在父对象和子对象之间传递状态。multiprocessing module可以使这一点更简单,允许您通过队列或管道将数据从子对象传递到父对象。在
更新了下面是一个使用
multiprocessing
模块让父进程与子进程共享值,并让子进程在队列中彼此通信的一个快速示意图。它使它变得非常简单:结果:
^{pr2}$下面是一个简单的函数,它在子进程中运行命令,然后将其环境提取到当前进程中。在
它基于Fnord的版本,没有tempfile,并且有一个标记行来区分SET命令和进程本身的任何输出。它不是防弹的,但它对我有用。在
你能在第一个子进程中打印出来并用python处理这个字符串吗?在
相关问题 更多 >
编程相关推荐