我正在尝试使用 UDP 连接创建一个网络项目。我创建的服务器必须是多线程的,以便能够从多个客户端接收多个命令。但是当
我正在尝试使用 UDP 连接创建一个网络项目。我创建的服务器必须是多线程的,以便能够从多个客户端接收多个命令。但是,当尝试对服务器进行多线程处理时,只有一个线程在运行。以下是代码:
def action_assigner():
print('Hello Assign')
while True:
if work_queue.qsize() != 0:
data, client_address, request_number = work_queue.get()
do_actions(data, client_address, request_number)
def task_putter():
request_number = 0
print('Hello Task')
while True:
data_received = server_socket.recvfrom(1024)
request_number += 1
taskRunner(data_received, request_number)
try:
thread_task = threading.Thread(target=task_putter())
action_thread = threading.Thread(target=action_assigner())
action_thread.start()
thread_task.start()
action_thread.join()
thread_task.join()
except Exception as e:
server_socket.close()
运行代码时,我只得到 Hello Task
结果,表示 action_thread
从未启动。有人能解释如何解决这个问题吗?
这里的问题是,在创建线程本身时,您 调用的 函数应该是每个线程的“主体”。执行该行时, thread_task = threading.Thread(target=task_putter())
Python 将首先解析括号内的表达式 - 它调用函数 task_putter
,该函数永远不会返回。程序中的后续行都不会运行。
在创建线程和其他以可调用对象作为参数的调用时,我们所做的是传递函数本身,而不是调用它(调用它将运行该函数并计算其返回值)。
只需将创建线程的两行更改为不在参数上放置调用括号 target=
,即可越过这一点:
...
try:
thread_task = threading.Thread(target=task_putter)
action_thread = threading.Thread(target=action_assigner)
...