python写wfq算法包括"sender.py","router.py","receiver.py"
时间: 2023-07-08 16:41:34 浏览: 89
好的,我可以为您提供一个基本的WFQ算法实现,包括sender.py,router.py和receiver.py。请注意,这只是一个简单的示例,您需要根据您的具体需求进行修改和优化。
sender.py:
```python
import socket
import time
def main():
# 创建socket
send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据
while True:
data = "hello world"
send_sock.sendto(data.encode(), ("127.0.0.1", 9999))
time.sleep(0.1)
if __name__ == '__main__':
main()
```
router.py:
```python
import socket
import threading
import queue
def wfq(queue_list, weight_list):
"""
WFQ算法
:param queue_list: 队列列表
:param weight_list: 权重列表
:return: 返回被选中的队列索引
"""
min_weight = min(weight_list)
index_list = [i for i, j in enumerate(weight_list) if j == min_weight]
min_len = float("inf")
selected_index = -1
for index in index_list:
if len(queue_list[index]) < min_len:
min_len = len(queue_list[index])
selected_index = index
return selected_index
def receiver(recv_sock, queue_list, weight_list):
"""
接收数据并进行WFQ
:param recv_sock: 接收端socket
:param queue_list: 队列列表
:param weight_list: 权重列表
"""
while True:
data, addr = recv_sock.recvfrom(1024)
index = wfq(queue_list, weight_list)
queue_list[index].put((data, addr))
def sender(send_sock, queue_list):
"""
发送数据
:param send_sock: 发送端socket
:param queue_list: 队列列表
"""
while True:
for queue in queue_list:
if not queue.empty():
data, addr = queue.get()
send_sock.sendto(data, addr)
def main():
# 创建socket
recv_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recv_sock.bind(("127.0.0.1", 9999))
send_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 创建队列
queue_list = [queue.Queue() for i in range(3)]
# 设置权重
weight_list = [1, 2, 3]
# 启动接收线程
recv_thread = threading.Thread(target=receiver, args=(recv_sock, queue_list, weight_list))
recv_thread.start()
# 启动发送线程
send_thread = threading.Thread(target=sender, args=(send_sock, queue_list))
send_thread.start()
if __name__ == '__main__':
main()
```
receiver.py:
```python
import socket
def main():
# 创建socket
recv_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recv_sock.bind(("127.0.0.1", 9999))
# 接收数据
while True:
data, addr = recv_sock.recvfrom(1024)
print(data.decode())
if __name__ == '__main__':
main()
```
在这个例子中,sender.py发送数据到router.py,router.py根据权重进行WFQ并将数据发送到receiver.py。您可以根据需要修改权重或添加更多队列。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)