Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字协助_Python - Fatal编程技术网

Python套接字协助

Python套接字协助,python,Python,尝试修复循环直到满足for循环才继续的friends代码。我觉得readbuffer有问题。基本上,我们希望while循环能够连续循环,但是如果for循环满意,就运行它。如果有人能帮助我了解readbuffer和temp中发生了什么,我将非常感谢 以下是片段: s = openSocket() joinRoom(s) readbuffer = "" while True: readbuffer = readbuffer + s.recv(1024) temp =

尝试修复循环直到满足for循环才继续的friends代码。我觉得readbuffer有问题。基本上,我们希望while循环能够连续循环,但是如果for循环满意,就运行它。如果有人能帮助我了解readbuffer和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