|
- process_num = 2*cpu_count()
- # 设置进程池、消息队列
- po = Pool(process_num)
- q = Manager().Queue() #ipc方法1
- m=Manager() # ipc方法2
- # 初始化并监听epoll
- epoll_fd = select.epoll()
- epoll_fd.register(serverSocket.fileno(), select.EPOLLIN)
- connections = {}
- addresses = {}
-
- # 循环接收请求
- while True:
- # epoll 进行 fd 扫描的地方 -- 未指定超时时间则为阻塞等待
- epoll_list = epoll_fd.poll()
- for fd, events in epoll_list:
- print("fd is:%s events is%s"%(fd,events))
- if fd == serverSocket.fileno():
- conn, addr = serverSocket.accept()
- conn.setblocking(False)
- epoll_fd.register(conn.fileno(), select.EPOLLIN | select.EPOLLET )
- connections[conn.fileno()] = conn
- addresses[conn.fileno()] = addr
- elif events & select.EPOLLIN:
-
-
-
- q.put(connections[fd])
- po.apply_async(workProcess4In,(q,epoll_fd)) # 非阻塞-进程池
- elif events & select.EPOLLOUT:
- q.put(fd)
- # d=m.dict({"epollfd":epoll_fd,"fd":fd})
- po.apply_async(workProcess4Out,(fd,epoll_fd))
- po.close()
- po.join()
- <div class="blockcode"><blockquote>def workProcess4In(q):
- # print("消息队列有:%s"%q.qsize())
- print("共享内存 is:%s"%q)
- # d["epollfd"].modify(d["fd"],select.EPOLLET | select.EPOLLOUT)
- # a = q.get()
- # 实验性,不行就放共享内存
- # epoll_fd = select.epoll()
- # epoll_list1 = epoll_fd.poll()
- print(epoll_list)
- # print("epoll2 is:%s"%epoll_fd)
- # print("a的文件描述符是%s"%a[1])
- epoll_fd.modify(a, select.EPOLLET | select.EPOLLOUT)
复制代码
半同步半异步。主进程负责接收请求,收到请求后,分发给其他进程处理。现在都问题是:epoll_fd传不过去其他进程。无论是用代码里面都q,还是m。2个IPC方法都不行。或者直接在apply_async的参数传。都无法传过去。困扰很久,请大佬们帮帮忙
|
|