使用multiprocessing.pool.map通过同一套接字发送

Jay*_*Jay 6 python python-3.x python-multiprocessing

我正在尝试通过套接字连接打包和发送列数据。

为了加快速度,我考虑过将包装(struct.pack)分成多个过程。

为了避免两种方式的腌制,我认为最好由打包过程自己发送数据,因为据说可以从Python 3.4开始腌制套接字对象。

这是我正在工作的简化版本:

import socket
from multiprocessing import Pool
from struct import pack

# Start and connect a socket
s = socket.socket()
s.connect((ip, port))

# Data to be packed and sent in this order
data1 = 1, 2, 3, 4
data2 = 5, 6, 7, 8
data3 = 9, 10, 11, 12

# Top level column packer/sender for mp.pool
def send_column(column):
    return s.send(pack(f'{len(column)}i', *column))


pool = Pool()

# Will this necessarily send the data in order?
pool.map(send_column, (data1, data2, data3))
Run Code Online (Sandbox Code Playgroud)

我的问题是-是否保证数据将按顺序发送?

如果没有,确保它的谨慎方法是什么?

我想到了一个全球计数器来检查流程是否已经轮到我了,但是我很高兴听到更好的想法。

小智 2

  1. 套接字将由进程共享,并且进程由操作系统调度程序控制,操作系统调度程序无法控制该进程的执行顺序。因此,进程对我们来说似乎是随机运行的(这不是完全正确的 - 检查操作系统调度算法),并且您无法保证执行顺序和包交付顺序。
  2. 从网络角度来看,当您通过共享套接字发送数据时,通常您不会等待响应(如果您使用 tcp 协议),这对我们来说将显示为同时数据包发送/传递,并且响应相同。

为了确保数据包按顺序传送,您需要确保发送的每个数据包对方都能收到,因此您只能使用同步连接(仅在发送前一个数据包之后发送数据包,并且您确保它是已收到)。在您的用例中,我建议您有一个进程池来生成腌制对象并将它们发送到队列(它们将是生产者)。另一个对象将是这些对象的使用者并通过网络发送它们。