【问题标题】:multiprocessing targets are run in the parent process instead, sequentially多处理目标在父进程中按顺序运行
【发布时间】:2018-07-16 22:32:40
【问题描述】:

我有一个函数orderbook(pair),它打开一个websocket,订阅一个频道并监听消息。我希望能够订阅多个频道并并行收听消息。有没有办法做到这一点?

到目前为止,我正在尝试以下操作:

from dev.orderbook import *
from multiprocessing import Process

def main():
    process01 = Process(target=orderbook('BTC-USD'))
    process02 = Process(target=orderbook('ETH-USD'))
    process01.start()
    process02.start()

if __name__ == '__main__':
    main()

但是,所有这些都是运行process01,并且只有当我停止脚本时它才会运行process02。这不是我正在寻找的行为。有什么方法可以同时订阅这两个频道并同时收听和打印消息/响应?如果没有,那么有什么方法可以启动一个进程 - 让它运行指定时间然后启动下一个进程?

我的 websocket 镜像如下:

import websocket

class orderbook(object):

def __init__(self, pair):
    self.pair = pair
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                          on_message = self.on_message,
                          on_error = self.on_error,
                          on_close = self.on_close)
    ws.on_open = self.on_open
    ws.run_forever()

def on_message(self, ws, message):
    print(message)

def on_error(self, ws, error):
    print(error)

def on_close(self, ws):
    print("### closed ###")

def on_open(self, ws):
   ws.send(self.pair)

【问题讨论】:

    标签: python websocket python-multiprocessing


    【解决方案1】:

    您的Process 构造函数包括对目标函数的实际调用。因此,在父进程中,在评估构造函数行的过程中调用该函数,并将结果作为target传递给Process()

    您应该传递函数本身,并单独传递其参数:

    process01 = Process(target=orderbook, args=('BTC-USD',))
    

    【讨论】:

    • 好的,谢谢!但是我怎样才能使用它来并行运行它们呢?还是有可能?
    • @walksignison “你应该传递函数本身,并单独传递它的参数。” 其他的,见the multiprocessing docs
    猜你喜欢
    • 2013-09-10
    • 1970-01-01
    • 2020-03-04
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2022-01-05
    • 2013-01-24
    相关资源
    最近更新 更多