例如,我的py脚本已经有一个实例在运行,当我使用args启动另一个实例时,不是让新实例运行,而是让它将其参数传递给主实例,或者让主实例等待args,这样它就可以对args做任何它需要做的事情。这样的事情有可能发生吗?
发布于 2014-06-24 16:14:08
这是可能的,但不是微不足道的,因为这些过程是无关的。因此,您必须设置:
<代码>F29
所以它可以工作,但它有很多工作...
如果你能把你限制在一个特定的架构(只有Windows或者只有Linux)并且使用特定的库,那么可能会有更简单的解决方案,但这将不是一项简单的工作。
发布于 2020-08-23 18:18:49
是的,像这样的事情是可能的。我不确定是否可以可靠地检测应用程序的一个实例(进程)是否已经在运行,但一种可能的方法是为程序保留一个TCP端口。第一个启动的应用程序将侦听该端口并充当服务器。由于只有进程可以在同一时间侦听同一端口,因此所有后续进程都将无法创建侦听套接字,因此可能会充当客户端。
您可以使用multiprocessing.connection来实现这一点。以下是一个演示该概念的工作示例:
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将打印以下输出:
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。该脚本将仅打印:
Starting client.但是,您的第一个应用程序(充当服务器)现在将打印:
Adding number 4. Total is now 10.
Adding number 5. Total is now 15.
Adding number 6. Total is now 21.如果您重复该命令,它将打印:
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中工作(可能需要做一些小的修改)。
https://stackoverflow.com/questions/24381227
复制相似问题