尝试修复朋友代码,其中循环不会继续,直到满足for循环。我觉得readbuffer有问题。基本上,我们希望while循环连续循环,但如果for循环满足则运行。有人可以帮我理解readbuffer和temp中发生的事情,我非常感激。
以下是片段:
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
答案 0 :(得分:0)
根据我对您的问题的理解,您希望在继续接收数据包的同时执行for循环。
如果有I / O操作(读/写文件,DB I / O,发送/接收...),我不确定你在getUser
和getMessage
中做了什么他们可以在python中使用async
功能来编写异步程序。 (见:https://docs.python.org/3/library/asyncio-task.html)
但是,我假设您只是从line
中提取单个元素,它不涉及I / O操作。在这种情况下,async
无济于事。如果getUser
和getMessage
确实占用了太多CPU时间,那么可以将for循环放在一个新线程中,使字符串操作无阻塞。 (见:https://docs.python.org/3/library/threading.html)
from threading import Thread
def getUserProfile(lines, profiles, i):
for line in lines:
user = getUser(line)
message = getMessage(line)
profiles.append((user, message))
profiles = []
threads = []
s = openSocket()
joinRoom(s)
while True:
readbuffer = s.recv(1024)
lines = readbuffer.decode('utf-8').split('\n')
t = Thread(target=getUserProfile, args=(lines, profiles, count))
t.run()
threads.append(t)
# If somehow the loop may be interrupted,
# These two lines should be added to wait for all threads to finish
for th in threads:
th.join() # will block main thread until all threads are terminated
<强>更新强>
当然,这不是解决此问题的典型方法,对于初学者和简单的作业来说,它更容易理解。
更好的方法是使用Future之类的东西,使send / recv异步,并将回调传递给它,以便它可以将接收到的数据传递给回调。如果您想将繁重的CPU工作负载转移到另一个线程创建无限循环(例程),只需在回调或其他地方创建Thread
,具体取决于您的架构设计。
我为网络编程课程实现了轻量级distributed computing framework。如果有人有兴趣,我会为项目编写自己的future class。