Tornado和multiprocessing和fork

本文探讨了使用Tornado Web框架结合fork系统调用实现多进程间的数据通信和资源共享。具体介绍了如何在Tornado中通过fork创建子进程,主进程与子进程间共享全局变量,并利用子进程PID进行进程控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import tornado
import tornado.web
import os
import socket
import multiprocessing
import time

l = multiprocessing.Manager().list()

port = 8888

class IndexHandler(tornado.web.RequestHandler):
	def initialize(self,child_pid):
		self.child_pid = child_pid
	def get(self):
		global l
		s='hello client, child pid = %d'%self.child_pid
		self.write(s)
		print(l)

def server(child_pid):
	sockets = tornado.netutil.bind_sockets(port,family = socket.AF_INET)
	app = tornado.web.Application([(r"/", IndexHandler,{'child_pid':child_pid}),])
	httpd = tornado.httpserver.HTTPServer(app)
	httpd.add_sockets(sockets)
	tornado.ioloop.IOLoop.current().start()

def child_process():
	global l
	print(os.getpid())
	while True:
		l.append(os.getpid())
		time.sleep(10)
		pass
	pass
def main():
	pid = os.fork()
	if pid == 0:
		child_process()
	else:
		server(pid)

if __name__ == '__main__':
	main()

1、原本是通过tornado建立服务器,然后接收数据,交给另一个进程处理。用multiprocessing建立进程的话,主进程必须得join,因为全局进程共享变量l会因为主进程的结束而结束。现在用了fork(),tornado作为主进程,另一个程序作为子进程。

2、tornado中,可以通过tornado.web.Application([(r"/", IndexHandler,{'child_pid':child_pid}),]),以及def initialize(self,child_pid),进行传参数,例子中就是传递子进程的pid给tornado,这样,tornado就可以通过psutil库里的相关函数对子进程唤醒或阻塞。

3、fork后,全局进程共享变量l,并没有拷贝一份,应该是进程变量不会受到影响吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值