【发布时间】:2016-08-20 17:09:47
【问题描述】:
我正在尝试创建一个非常简单的聊天。使用 PyZMQ 库。由于套接字不是线程安全的,我使用两个套接字和一个线程在每个套接字上运行。一个检查传入消息,一个检查发送消息。
但是我的程序给了我错误信息:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\lib\multiprocessing\forking.py", line 381, in main
self = load(from_parent)
File "C:\Python27\lib\pickle.py", line 1384, in load
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\lib\multiprocessing\forking.py", line 381, in main
self = load(from_parent)
File "C:\Python27\lib\pickle.py", line 1384, in load
return Unpickler(file).load()
File "C:\Python27\lib\pickle.py", line 864, in load
return Unpickler(file).load()
File "C:\Python27\lib\pickle.py", line 864, in load
dispatch[key](self)
File "C:\Python27\lib\pickle.py", line 1089, in load_newobj
dispatch[key](self)
File "C:\Python27\lib\pickle.py", line 1089, in load_newobj
obj = cls.__new__(cls, *args)
File "zmq\backend\cython\socket.pyx", line 279, in zmq.backend.cython.socket.Socket.__cinit__ (zmq\backend\cython\socket.c:3456)
TypeError: context must be specified
obj = cls.__new__(cls, *args)
File "zmq\backend\cython\socket.pyx", line 279, in zmq.backend.cython.socket.Socket.__cinit__ (zmq\backend\cython\socket.c:3456)
TypeError: context must be specified
我不知道为什么我会得到它们,或者如何解决它。
这也是我的逻辑错了吗?:
我们启动创建套接字并将其绑定到端口的服务器。然后它侦听该套接字以获取消息/连接。然后我们创建另一个套接字并将其绑定到同一个端口。我们创建了一个新线程,以便我们等待在第一个套接字上接收到消息,然后将其发送到第二个套接字。 然后我们有一个连接到第一个套接字的客户端。我们为它创建一个新线程,以便它可以在另一个套接字上侦听传入消息,因此它可以使用第一个线程通过第一个套接字发送消息。
server.py
from communication import Communication
from multiprocessing import Process
import zmq
import random
import sys
import time
if __name__ == '__main__':
if len(sys.argv) > 1:
port = sys.argv[1]
else:
port = "5556"
c = Communication(port)
c.bind()
recieverP = Process(target=c.reciever)
recieverP.start()
print("first process")
c2 = Communication(port)
c2.connect()
senderP = Process(target=c2.sender)
senderP.start()
print("second process")
client.py
from communication import Communication
from multiprocessing import Process
import zmq
import random
import sys
import time
if __name__ == '__main__':
if len(sys.argv) > 1:
port = sys.argv[1]
else:
port = "5556"
c = Communication(port)
c.connect()
recieverP = Process(target=c.reciever, args=())
senderP = Process(target=c.sender,args=())
recieverP.start()
senderP.start()
communications.py
import zmq
class Communication:
def __init__(self, port):
context = zmq.Context.instance()
self.port = port
self.socket = context.socket(zmq.PAIR)
def connect(self):
self.socket.connect("tcp://localhost:%s" % self.port)
def bind(self):
self.socket.bind("tcp://*:%s" % self.port)
def sender(self):
while True:
msg = raw_input("> ")
self.socket.send(msg)
def reciever(self):
while True:
msg = self.socket.recv()
print("> " + msg)
【问题讨论】:
-
...此外,错误应在问题中以文本形式给出,而不是在场外托管的图像(问题需要直接在问题本身中包含错误认为完整)。 Microsoft 的终端确实 允许复制/粘贴,因此您没有理由无法访问该原始文本。
-
@CharlesDuffy 你是对的。我将编辑错误。我不知道给我的问题取什么标题,因为我不知道它会导致什么错误,
TypeError? -
"TypeError: context must be specified" in zmq unpickling
-
...听起来沙丘有一个答案,可以完全避免酸洗/解酸;使您的对象可腌制的答案也是可能的。
-
@CharlesDuffy 谢谢!我编辑了我的帖子。是的,我希望这会奏效。
标签: python multithreading sockets chat pyzmq