小编juk*_*uke的帖子

套接字对象可以与Python的多处理共享吗?socket.close()似乎不起作用

我正在编写一个服务器,它为每个客户端使用multiprocessing.Process.socket.accept()在父进程中被调用,连接对象作为Process的参数给出.

问题是,当调用socket.close()时,套接字似乎没有关闭.客户端的recv()应该在服务器上调用close()后立即返回.这是使用threading.Thread或只是处理主线程中的请求的情况,但是当使用多处理时,客户端的recv似乎永远挂起.

一些来源表明套接字对象应该作为句柄与multiprocessing.Pipes和multiprocess.reduction共享,但它似乎没有什么区别.

编辑:我在Linux 64位上使用Python 2.7.4.

以下是演示此问题的示例实现.

server.py

import socket
from multiprocessing import Process
#from threading import Thread as Process

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 5001))
s.listen(5)

def process(s):
    print "accepted"
    s.close()
    print "closed"

while True:
    print "accepting"
    c, _ = s.accept()
    p = Process(target=process, args=(c,))
    p.start()
    print "started process"
Run Code Online (Sandbox Code Playgroud)

client.py

import socket

s = socket.socket()
s.connect(('', 5001))
print "connected"
buf = s.recv(1024)

print "buf: '" + buf +"'"

s.close()
Run Code Online (Sandbox Code Playgroud)

python sockets ipc multiprocessing

4
推荐指数
1
解决办法
4414
查看次数

添加到列表时为什么Python复制值而不是指针?

我想做什么(C代码):

int a = 2, b = 3, c = 4;

int* arr[3] = {&a, &b, &c};

for (int i = 0; i < 3; ++i) {
    if (*(arr[i]) > 1) {
        *(arr[i]) = 1
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待Python用这段代码做类似的行为指针.

>>> a = 2
>>> b = 3
>>> c = 4
>>> for x in [a, b, c]:
...     if x > 1:
...             x = 1
... 
>>> a,b,c
(2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

如何在Python中实现C代码的行为?

python pointers scope

2
推荐指数
1
解决办法
1712
查看次数

如何在Go中强制传递参数作为指针?

我正在实现一个在Go中使用JSON的应用层网络协议.

func ReadMessage(conn net.Conn, returnMessage interface{}) bool {
    messageBytes := // read from conn

    error := json.Unmarshal(messageBytes, &returnMessage)
    if error != nil {
        return false
    }

    return true
}
Run Code Online (Sandbox Code Playgroud)

该函数将struct作为其第二个参数,其中消息是unmarshalled.该函数可以像这样调用:

msg := MessageType1{}
ok := ReadMessage(conn, &msg)
Run Code Online (Sandbox Code Playgroud)

或没有&符号(&)

msg := MessageType1{}
ok := ReadMessage(conn, msg)
Run Code Online (Sandbox Code Playgroud)

这将编译,但不会做什么应该因为结构作为副本传递,而不是作为引用,原始的msg将保持为空.所以我想通过引用强制传递结构并在编译时捕获此错误.

将参数类型更改为*interface {}将无法编译:

cannot use &msg (type *MessageType1) as type *interface {} in function argument:
*interface {} is pointer to interface, not interface
Run Code Online (Sandbox Code Playgroud)

是否有一些Go风格的方式正确地做到这一点?

parameters struct pointers go

1
推荐指数
1
解决办法
414
查看次数

标签 统计

pointers ×2

python ×2

go ×1

ipc ×1

multiprocessing ×1

parameters ×1

scope ×1

sockets ×1

struct ×1