标签: multiple-processes

python和java之间的IPC(进程间通信)

首先,我首先要解释为什么我首先要问这个问题:我正在编写一个python程序(带有一个wxPython gui),需要从python调用Java AWT程序并从中提取数据.我在Windows上有一个进程内工作解决方案.只要我无头地运行Java应用程序,我在OSX上也有一个进程内解决方案.遗憾的是,我找不到在OSX上在同一进程中运行两个GUI的合理解决方案,因为AWT和WX都想要第一个线程并且不能共享wx消息循环.

What I would like to do is to launch a Java program in a separate process from my Python program and establish a pipe or queue or something for passing data (specifically byte arrays) back and forth.

I'd greatly appreciate any suggestions, or even a nudge in the right direction as I have very little experience with IPC.

python java ipc multiprocessing multiple-processes

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

具有多个子创建的代码中的问题

这段代码是我的操作系统项目的一部分,项目要求做一些应用并发进程的东西,我决定用两个玩家做一个客户服务器扑克项目,我用儿子和孙子进程来确定手牌价值.

代码中应用的方案如下:

1 http://f.cl.ly/items/2f3x3z1A3z1n3r2b0X0N/schema.jpg

代码的问题在于,在同一游戏中只有第一只手被正确评估,实际上第二只手是不正确的,而在第三局游戏中有错误并且程序结束,这发生在每一个新游戏中

这是代码:

void check_hand(int suits[5],int ranks[5],int *point){

    pid_t son[2];
    int i,j;

    for (i = 0; i < 2; i++){
            son[i]=fork();

    /***********************************************
            straight flush son
    ************************************************/

            if(son[i]==0 && i==0){
                    pid_t grandson[3];
                    int k;
                    for(k=0;k<3;k++){
                            grandson[k]=fork();
                            if(grandson[k]==0 && k==0){
                                    exit(F_highcard(ranks));
                            }
                            else if(grandson[k]==0 && k==1){
                                    exit(F_flush(suits));
                            }
                            else if(grandson[k]==0 && k==2){
                                    exit(F_straight(ranks));
                            }
                            else if(grandson[k]<0){
                                    puts("fork failed");
                                    exit(-1);
                            }
                    }
                    int exit_status_straight,exit_status_flush,exit_status_highcard;
                    //waiting his sons
                    waitpid(grandson[0],&exit_status_highcard,0);
                    waitpid(grandson[1],&exit_status_flush,0);
                    waitpid(grandson[2],&exit_status_straight,0);

                    /**checkpoint A****/

                    //elaborate the exit statuses and exit with a …
Run Code Online (Sandbox Code Playgroud)

c fork multiple-processes

7
推荐指数
1
解决办法
315
查看次数

从子进程的stdout同步异步读取

我有应用程序启动子进程stdout异步处理它.问题是异步操作需要一些时间,我希望负责进程执行的方法所有异步IO操作完成后结束.

我有这样的代码:

using System.Diagnostics;

Process process = new Process();
// ...
process.OutputDataReceived += new DataReceivedEventHandler(this.OnRecvStdOut);
process.ErrorDataReceived += new DataReceivedEventHandler(this.OnRecvStdErr);
// ...
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
// ...
process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找一种方法告诉程序等待所有IO(OnRecvStdOut)操作完成.

我虽然使用了System.Threading类中的一个,但我不确定哪个类最适合这个以及如何执行此操作,最好的方法可能是:

public void OnRecvStdOut(...)
{
    something.Increase();
    // the stuff that takes so long
    something.DecreaseAndSignal();
}
Run Code Online (Sandbox Code Playgroud)

并在主要功能:

something.WaitUntilZero();
Run Code Online (Sandbox Code Playgroud)

注:我想同时允许StdErrStdOut并行处理. Something不能依赖那个Wait会被调用的Signal,因为Increase()DecreaseAndSignal()对会在Wait发生之前被多次调用.

我想到的第二件事就是可以多次发出信号(无需处理信号)并在主函数中使用循环,如:

while( ioOperations > 0){
    something.WaitForSignal(500);
}
Run Code Online (Sandbox Code Playgroud)

编辑:当前工作解决方案: …

c# io synchronization multiple-processes

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

是否正确使用Parcelable在应用程序之间发送数据?

我试图了解如何在Android中的应用程序之间进行通信 - 而不仅仅是在Activity实例之间.

我建立了一个"客户端",它将一个Messenger obj发送给一个服务(在Intent发送到服务中); 该服务创建一个Messageobj并使用它将其发送回'client' messenger.send(message).这工作正常,直到我尝试使用Message.obj来保存对象.

我在服务中创建了自己的ParcelableMyParcelable并将其放入消息中.一切都有效,直到消息在"客户端"中被解组.unmarshall失败,因为'客户'无法访问MyParcelable该类.这是显而易见的-他们是在不同的包(说com.whatever.myclientcom.whatever.myserver).这完全是错误的方法吗?

我也尝试过创建Parcel并发送(两个应用程序都可以访问该类) - 但事实Parcel并非如此Parcelable.我已经阅读过关于正在使用的类加载器,但是不了解单独的应用程序中的单独的类加载器(进程,如果我在这方面理解Android架构).也就是说,如何对一个类加载器"教授"另一个类加载器中存在的类?当然看起来应该有一个明显的"这就是你如何做到",但我还没有看到它.

android marshalling unmarshalling parcelable multiple-processes

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

使用Flask的Werkzeug和类状态:当类没有重新初始化时,类成员变量如何重置?

我正在尝试编写一个烧瓶扩展,需要在请求之间保留一些信息.当我使用单个进程运行Werkzeug时这很好用,但是当我运行多个进程时,我得到了一些我不理解的奇怪行为.以这个简单的应用程序为例:

from flask import Flask
app = Flask(__name__)

class Counter(object):
    def __init__(self, app):
        print('initializing a Counter object')
        self.app = app
        self.value = 0

    def increment(self):
        self.value += 1
        print('Just incremented, current value is ', self.value)

counter = Counter(app)

@app.route('/')
def index():
    for i in range(4):
        counter.increment()
    return 'index'

if __name__ == '__main__':
    #scenario 1 - single process
    #app.run()
    #scenario 2 - threaded
    #app.run(threaded=True)
    #scenario 3 - two processes
    app.run(processes=2)
Run Code Online (Sandbox Code Playgroud)

对于前两个场景,它的行为完全符合我的预期:Counter对象初始化一次,然后随着对'/'路径的每个请求递增.当我使用第三个场景运行它(传递进程= 2)然后我得到它作为输出:

 initializing a Counter object
  * Running on http://127.0.0.1:5000/ (Press …
Run Code Online (Sandbox Code Playgroud)

python werkzeug multiple-processes flask

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

为什么简单的三路多数投票不能解决拜占庭错误?

我最近读了很多关于拜占庭容错的论文。有一个常见的证明,需要 3m+1 台计算机来处理 m 个拜占庭故障。一般证明是这样的:

存在三个“将军”:A、B、C。假设将军们是这样沟通的,其中C是“叛徒”:

A --> B "Attack", A --> C "Attack"
B --> A "Attack", B --> C "Attack"
C --> A "Attack", C --> B "Retreat"

A receives "Attack" from both sources, and will attack.
B receives "Attack" from A but "Retreat" from C and doesn't know what to do.
C is a traitor, so his action could be anything.
Run Code Online (Sandbox Code Playgroud)

因此,我们不能保证大多数参与者会达成共识。

我有点理解这个证明,但似乎忽略了一个要点。A、B、C不也各自内部计算着要做什么吗?由于A和B是这里的“忠诚”将军,因此似乎“正确”的行动是进攻。难道B在决定做什么时不允许考虑他自己的计算吗?在这种情况下,他可以轻松打破相互冲突的 A&C 输入之间的联系并决定进攻。然后,A和B都进攻,问题就解决了。这是一个与经典的拜占庭将军问题不同的问题吗?

fault-tolerance distributed-computing distributed-system multiple-processes

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

如何从多个 python-flask 子进程收集普罗米修斯指标?

我有 main() 函数,它生成两个单独的子进程。这两个子流程共享指标。如何共享两个流程的指标并保持更新?这是我的片段,以供更多理解。

from multiprocessing import Process
import prometheus_client as prom
from prometheus_client import Counter

# Metrics
c1 = prom.gauge('Counter1', 'Number of Request')
c2 = prom.gauge('Gauge1', 'Processing time in Seconds')

def process_abc():
  while True:
    #Some operations
    c1.set(some_value)
    c2.set(some_value)
    time.sleep(10)

def process_xyz():
   while True:
     #Some operations
     c1.set(some_value)
     c2.set(some_value)
     time.sleep(10)

def main():
  prom.start_http_server(8080)

  Process(target=process_abc).start()
  Process(target=process_xyz).start()

if __name__ == "__main__":
  main()
Run Code Online (Sandbox Code Playgroud)

我能够在端点看到指标名称,但计数始终为零意味着它永远不会被子流程更新。

python metrics multiple-processes python-3.x prometheus

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

防止调试会话在每次低级退出后暂停

我正在使用gdb非常方便的多劣支持来调试进程树:

(gdb) set detach-on-fork off
(gdb) set schedule-multiple on
(gdb) set follow-fork-mode parent
(gdb) break PostgresMain
(gdb) break PostmasterMain
Run Code Online (Sandbox Code Playgroud)

现在需要让事情运行,直到我在一些尚未产生的劣势中遇到未来的断点之一。

但是,gdb每当低级正常退出时似乎“有帮助”暂停,或者至少阻止对低级的清理以便其父级wait()可以返回:

(gdb) c
[New process 16505]
process 16505 is executing new program: /home/craig/pg/bdr/bin/pg_config
Reading symbols from /home/craig/pg/bdr/bin/pg_config...done.
[Inferior 2 (process 16505) exited normally]
(gdb) info inferior
  Num  Description       Executable        
* 2    <null>            /home/craig/pg/bdr/bin/pg_config 
  1    process 16501     /usr/bin/make     
(gdb) inferior 1
[Switching to inferior 1 [process 16501] (/usr/bin/make)]
[Switching to thread 1 (process 16501)] …
Run Code Online (Sandbox Code Playgroud)

debugging gdb multiple-processes

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

在 Docker 中运行多个 python 进程

我是 docker 新手,试图在 docker 中运行多个 python 进程。虽然不推荐,但它应该按照这里的建议工作“ https://docs.docker.com/engine/admin/multi-service_container/

我的 Dockerfile :

FROM custom_image
MAINTAINER Shubham 
RUN apt-get update -y
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
ENTRYPOINT ["/bin/bash"]
CMD ["start.sh"]
Run Code Online (Sandbox Code Playgroud)

开始.sh:

nohup python flask-app.py &
nohup python sink.py &
nohup python faceConsumer.py &
nohup python classifierConsumer.py &
nohup python demo.py &
echo lastLine
Run Code Online (Sandbox Code Playgroud)

运行命令:

docker run --runtime=nvidia -p 5000:5000 out_image
Run Code Online (Sandbox Code Playgroud)
  • 当我转到终端并运行时,相同的 shell 脚本工作。
  • 没有 nohup 试过,没有用。
  • 尝试 python subprocess 也启动其他 python 进程,没有工作。

是否可以在没有 supervisord 或 docker-compose …

python shell multiple-processes docker dockerfile

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

Docker 容器未正确使用 CPU

单个 docker 容器适用于较少数量的并行进程,但是当我们将并行进程的数量增加到 20-30 时,进程执行会变慢。进程变得越来越慢,但 docker 仍然只使用了 30-40% 的 CPU。

我尝试了以下方法让 docker 使用适当的 cpu 并且不减慢进程-

  1. 我已经明确地将 cpu 和 ram 分配给了 docker 容器。
  2. 我还使用 ulimit 增加了文件描述符的数量、进程数量和堆栈大小。

即使在做了这两件事之后,容器仍然没有正确使用 cpu。我正在使用 docker exec 在单个运行的容器中启动多个进程。有没有什么有效的方法可以使用单个 docker 容器来执行多个进程或使容器使用 100% 的 cpu?

我使用的配置是

服务器 - aws ec2 t2.2Xlarge(8 核,32 GB 内存)

Docker 版本 - 18.09.7

操作系统- ubuntu 18.04

containers multiple-processes docker

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