Python套接字辅助

时间:2017-03-12 06:28:39

标签: python

尝试修复朋友代码,其中循环不会继续,直到满足for循环。我觉得readbuffer有问题。基本上,我们希望while循环连续循环,但如果for循环满足则运行。有人可以帮我理解readbuffer和temp中发生的事情,我非常感激。

以下是片段:

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

1 个答案:

答案 0 :(得分:0)

根据我对您的问题的理解,您希望在继续接收数据包的同时执行for循环。

如果有I / O操作(读/写文件,DB I / O,发送/接收...),我不确定你在getUsergetMessage中做了什么他们可以在python中使用async功能来编写异步程序。 (见:https://docs.python.org/3/library/asyncio-task.html

但是,我假设您只是从line中提取单个元素,它不涉及I / O操作。在这种情况下,async无济于事。如果getUsergetMessage确实占用了太多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