首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -禁用多个py脚本实例并将其参数传递到主实例

Python -禁用多个py脚本实例并将其参数传递到主实例
EN

Stack Overflow用户
提问于 2014-06-24 15:53:37
回答 2查看 226关注 0票数 0

例如,我的py脚本已经有一个实例在运行,当我使用args启动另一个实例时,不是让新实例运行,而是让它将其参数传递给主实例,或者让主实例等待args,这样它就可以对args做任何它需要做的事情。这样的事情有可能发生吗?

EN

Stack Overflow用户

发布于 2020-08-23 18:18:49

是的,像这样的事情是可能的。我不确定是否可以可靠地检测应用程序的一个实例(进程)是否已经在运行,但一种可能的方法是为程序保留一个TCP端口。第一个启动的应用程序将侦听该端口并充当服务器。由于只有进程可以在同一时间侦听同一端口,因此所有后续进程都将无法创建侦听套接字,因此可能会充当客户端。

您可以使用multiprocessing.connection来实现这一点。以下是一个演示该概念的工作示例:

代码语言:javascript
运行
复制
import multiprocessing.connection
import sys

SERVER_HOST = 'localhost'
SERVER_PORT = 6000

g_total = 0


def process_numbers(numbers):
    global g_total
    for number in numbers:
        g_total += number
        print('Adding number %d. Total is now %d.' % (number, g_total))


def server_main(listener, numbers):
    process_numbers(numbers)
    print('Starting server.')
    while True:
        client = listener.accept()
        numbers = list(client.recv())
        client.close()
        if not numbers:
            break
        process_numbers(numbers)


def client_main(numbers):
    client = multiprocessing.connection.Client((SERVER_HOST, SERVER_PORT), 'AF_INET')
    print('Starting client.')
    client.send(numbers)


def main():
    numbers = map(int, sys.argv[1:])
    try:
        listener = multiprocessing.connection.Listener((SERVER_HOST, SERVER_PORT), 'AF_INET')
    except OSError:
        client_main(numbers)
    else:
        server_main(listener, numbers)

if __name__ == '__main__':
    main()

假设您已将上述代码另存为main.py,调用py main.py 1 2 3将打印以下输出:

代码语言:javascript
运行
复制
Adding number 1. Total is now 1.
Adding number 2. Total is now 3.
Adding number 3. Total is now 6.
Starting server.

应用程序将继续运行。现在打开第二个终端并运行py main.py 4 5 6。该脚本将仅打印:

代码语言:javascript
运行
复制
Starting client.

但是,您的第一个应用程序(充当服务器)现在将打印:

代码语言:javascript
运行
复制
Adding number 4. Total is now 10.
Adding number 5. Total is now 15.
Adding number 6. Total is now 21.

如果您重复该命令,它将打印:

代码语言:javascript
运行
复制
Adding number 4. Total is now 25.
Adding number 5. Total is now 30.
Adding number 6. Total is now 36.

诸若此类。您可以通过调用不带参数的客户端来退出服务器。

注意:这个答案是为Python3.7编写的,并在Python3.7中测试过,因为Python2.x已经死了。但是multiprocessing.connection也是exists in Python 2.7的,所以我认为代码应该也可以在Python2.7中工作(可能需要做一些小的修改)。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24381227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档