Python套接字协助
尝试修复循环直到满足for循环才继续的friends代码。我觉得readbuffer有问题。基本上,我们希望while循环能够连续循环,但是如果for循环满意,就运行它。如果有人能帮助我了解readbuffer和temp中发生了什么,我将非常感谢 以下是片段:Python套接字协助,python,Python,尝试修复循环直到满足for循环才继续的friends代码。我觉得readbuffer有问题。基本上,我们希望while循环能够连续循环,但是如果for循环满意,就运行它。如果有人能帮助我了解readbuffer和temp中发生了什么,我将非常感谢 以下是片段: s = openSocket() joinRoom(s) readbuffer = "" while True: readbuffer = readbuffer + s.recv(1024) temp =
s = openSocket()
joinRoom(s)
readbuffer = ""
while True:
readbuffer = readbuffer + s.recv(1024)
temp = string.split(readbuffer, "\n")
readbuffer = temp.pop()
for line in temp:
user = getUser(line)
message = getMessage(line)
根据我对您问题的理解,您希望在继续接收数据包的同时执行for循环 我不确定您在
getUser
和getMessage
中做了什么,如果其中有I/O操作(读/写文件、DB I/O、发送/接收…),您可以使用python中的async
功能来编写异步程序。(见:)
但是,我假设您只是从行
中提取一个元素,它不涉及任何I/O操作。在这种情况下,async
没有帮助。如果getUser
和getMessage
确实占用了太多的CPU时间,那么可以将for循环放在一个新线程中,使字符串操作无阻塞。(见:)
更新 当然,这不是解决这个问题的典型方法,对于初学者和简单的作业来说,这更容易理解 一个更好的方法是使用类似的东西,使send/recv异步,并向其传递回调,以便它可以将接收到的数据传递给回调。如果您想将繁重的CPU工作负载转移到另一个线程,创建一个无休止的循环(例程),只需在回调或其他地方创建一个
线程,具体取决于您的体系结构设计
我为我的网络编程课程实现了一个轻量级的。如果有人感兴趣,我也为这个项目写了自己的。你能给我们一个上下文和完整的代码,让我们更好地理解你的意思吗?如果你想要一个行缓冲(和阻塞)套接字,有。只需编辑更多内容。对不起,我忘了顶部的一些变量。谢谢你的回答!就我所知,在读取100次后,这不会停止吗?是的,因为需要给线程提供准确的内存位置(参考),以便将其数据存储在共享内存中(配置文件列表),所以需要事先分配一个固定大小的列表。因此,如果配置文件的数量超过了分配的内存大小,它应该停止。@Dug我在文章的底部添加了一些注释。如果这有帮助,请投票。嘿@J0e1in,我尝试了你的初学者解决方案,但无法将“行”作为参数。我还有另一个问题:所以recv会阻止它运行,直到它接收到某个东西(对吗?),如果发送了某个东西,是否有其他的接收函数或方法让它使用receive?否则,继续循环吗?@Dug对不起,我没有测试就直接从你的代码中复制了。我做了一些调整并测试了它。我发现在使用python线程类时,可以使用list.append
,这对我来说是出乎意料的。(我在纯C中学习了低级线程编程。)这意味着您可以存储任意多个配置文件,并永远收听连接。
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