我有一个我正在研究的程序,它将同时从两个"网络源"读取.我想尝试一种异步方法,而不是使用线程.这让我想知道使用哪个库...
我想出了一些简单的示例代码,它可以演示我的程序将要执行的操作:
import sniffer
def first():
for station in sniffer.sniff_wifi():
log(station.mac())
def second():
for station in sniffer.sniff_ethernet():
log(station.mac())
first()
second()
Run Code Online (Sandbox Code Playgroud)
这两种sniffer方法看起来有点像这样:
def sniff_wifi(self):
while True:
yield mac_address
Run Code Online (Sandbox Code Playgroud)
该while True循环显然使得它们阻塞.
我想用asyncore它,因为它是标准库的一部分.没有第三方依赖是奖金.但是,这并不意味着如果你建议我做的话我不会用它...
我可以实现我想用asyncore做的事情吗?如果是这样,你能告诉我如何将我的示例代码转换为'asyncore代码'吗?你知道任何好的asyncore教程吗?
我需要创建一个可以接收和存储SMTP消息的类,即电子邮件.为此,我asyncore根据此处发布的示例使用.但是,asyncore.loop()阻塞所以我不能在代码中做任何其他事情.
所以我想到了使用线程.这是一个示例代码,显示了我的想法:
class MyServer(smtpd.SMTPServer):
# derive from the python server class
def process_message(..):
# overwrite a smtpd.SMTPServer method to be able to handle the received messages
...
self.list_emails.append(this_email)
def get_number_received_emails(self):
"""Return the current number of stored emails"""
return len(self.list_emails)
def start_receiving(self):
"""Start the actual server to listen on port 25"""
self.thread = threading.Thread(target=asyncore.loop)
self.thread.start()
def stop(self):
"""Stop listening now to port 25"""
# close the SMTPserver from itself
self.close()
self.thread.join()
Run Code Online (Sandbox Code Playgroud)
我希望你能得到这张照片.该类MyServer应该能够以非阻塞的方式开始和停止侦听端口25,能够在收听(或不收听)时查询消息.该start …
我需要在Python中使用回调类功能,我多次向Web服务发送请求,每次都更改参数.我希望这些请求同时发生而不是顺序发生,所以我希望异步调用该函数.
它看起来像asyncore是我可能想要使用的,但我看到它的工作原理的例子看起来都像是矫枉过正,所以我想知道是否还有另一条道路我应该倒下.关于模块/流程的任何建议?理想情况下,我想以程序方式使用它们而不是创建类,但我可能无法绕过它.
我对这个简单的python脚本的性能有一些疑问:
import sys, urllib2, asyncore, socket, urlparse
from timeit import timeit
class HTTPClient(asyncore.dispatcher):
def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect( (host, 80) )
self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
self.data = ''
def handle_connect(self):
pass
def handle_close(self):
self.close()
def handle_read(self):
self.data += self.recv(8192)
def writable(self):
return (len(self.buffer) > 0)
def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
url = 'http://pacnet.karbownicki.com/api/categories/'
components = urlparse.urlparse(url)
host = components.hostname or ''
path = components.path
def fn1():
try:
response = urllib2.urlopen(url)
try: …Run Code Online (Sandbox Code Playgroud) 我不熟悉asyncore,并且对异步编程的知识非常有限,除了一些扭曲的教程介绍.
我最熟悉线程并在我的所有应用程序中使用它们.一个特定的应用程序使用couchdb数据库作为其接口.这涉及对数据库进行longpolling以寻找更改和更新.我用于couchdb的模块是couchdbkit.它使用asyncore循环来监视这些更改并将它们发送到回调.
所以,我从这个回调中发现了我启动工作线程的地方.混合异步和线程编程似乎有点粗糙.我真的很喜欢couchdbkit,但不想在我的程序中引入问题.
所以,我的问题是,从异步回调中触发线程是否安全?
这是一些代码......
def dispatch(change):
global jobs, db_url # jobs is my queue
db = Database(db_url)
work_order = db.get(change['id']) # change is an id to the document that changed.
# i need to get the actual document (workorder)
worker = Worker(work_order, db) # fire the thread
jobs.append(worker)
worker.start()
return
main()
.
.
.
consumer.wait(cb=dispatch, since=update_seq, timeout=10000) #wait constains the asyncloop.
Run Code Online (Sandbox Code Playgroud)
更新:
在仔细研究了这个之后,我还有一个关于couchdbkit大师的问题.使用该数据库可能有数百个线程.正如您在我的代码示例中所看到的,我正在为每个线程实例化一个couchdbkit.Database对象.我认为这可能是浪费.那么,在线程中全局使用单个数据库对象是否可以?
我目前正在尝试使用Python asyncore和pyqt4学习网络.
我编写了一个小型服务器,它基本上监听某个端口,并将收到的所有消息重新发送给发送方.
由于这两种QTS QApplication.exec_()和asyncore.loop()是永不回我不能都在一个线程启动它们的功能,所以我盯着asyncore.loop()在一个单独的守护线程.
每当我的服务器类(派生自asyncore.dispatcher)建立或删除连接,或发送/接收消息时,它都会调用我的窗口类(派生自QtGui.QMainWindow)的方法,这些方法在a中显示信息QPlainTextEdit.
但除非您使用鼠标标记文本,否则文本不可见.
Python控制台显示以下错误消息:
QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
Run Code Online (Sandbox Code Playgroud)
我在一些论坛上看到,这可能是由于从另一个线程调用qt-functions引起的,并且使用信号和插槽而不是普通函数调用可能会解决问题,但我也试过了信号,我仍然得到这个错误.
所以,(如果这确实是我的问题的原因)有什么正确的方法从另一个线程调用qt对象的方法?
编辑更多信息: asyncore.loop()调用位于子线程中,它不是真正阻塞,但仅在asyncore.loop()的运行时期间,我的Server类(asyncore.dispatcher)可以进行网络连接.因此,在asyncore.loop()的运行时期间,我的Server类的方法由asyncore.loop()(=子线程)调用,并且在这些我试图向主线程中运行的窗口类发出信号
编辑:好像我现在正在使用它,我的代码中有一些错误,现在所有信号都按预期工作.
编辑:小例子:http://paste2.org/p/635612(死链接)
我正在尝试学习asyncore模块.所以我决定开发一个聊天程序.我必须同时听网络和广播udp包.但问题是当用户键入消息时,用户无法看到其他用户发送的其他消息.我该怎么办?我的代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import asyncore
import socket
class Listener(asyncore.dispatcher):
def __init__(self, port):
asyncore.dispatcher.__init__(self)
self.port = port
self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.bind(('', self.port))
def handle_connect(self):
print "CONNECTED."
def handle_read(self):
data, addr = self.recvfrom(1024)
print str(addr) + " > " + data
def handle_write(self):
pass
class Sender(asyncore.dispatcher):
def __init__(self, port):
asyncore.dispatcher.__init__(self)
self.buffer = ""
self.port = port
self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
self.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
self.bind(('',0))
def handle_connect(self):
print "CONNECTED."
def handle_read(self):
pass
def handle_write(self):
if self.buffer != "":
sent …Run Code Online (Sandbox Code Playgroud) 是否有可能整合asyncore与dbus通过相同main loop?
通常,DBus集成是通过glib主循环完成的:是否可以asyncore集成这个主循环或者使用dbus asyncore?
我在文档中找不到这个,但是我怎么打算在asyncore.loop()不使用信号的情况下突破?
我正在尝试从过渡asyncore到asyncio从我将一些旧代码从python 27移植到python 35.但我对两者都不是很熟悉.
以下是有问题的部分的浓缩版本:
import socket
import asyncore
mapDict = {}
fc = FeedbackController(port)
fc.start()
class FeedbackController(object):
def __init__(self, port=None):
self.ipcchannel = IPCConnectionHandler(self, theMap=mapDict)
self.udpconnectionhandler = UDPDispatcher(self, theMap=mapDict)
def start(self):
asyncore.loop(timeout=60.0,map=theMap)
…
class UDPDispatcher(asyncore.dispatcher):
def __init__(self, theMap):
asyncore.dispatcher.__init__(self, map=theMap)
self.create_socket(socket.AF_INET, socket.SOCK_DGRAM)
self.bind((LOCALHOST, FC_PORT))
class IPCConnectionHandler(asyncore.dispatcher):
def __init__(self,theMap=None):
asyncore.dispatcher.__init__(self, map=theMap)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.bind((LOCALHOST, IPC_PORT))
self.listen(5)
Run Code Online (Sandbox Code Playgroud)
目前,我正在Macos Sierra上运行,当它asyncore.loop被召唤时它会崩溃
任何关于如何过渡的帮助都会很棒
asyncore ×10
python ×9
asynchronous ×2
couchdb ×1
dbus ×1
ipv6 ×1
loops ×1
macos-sierra ×1
pyqt4 ×1
python-3.x ×1
qt4 ×1
raw-input ×1
smtp ×1
twisted ×1
urllib2 ×1