标签: asyncore

哪个Python异步库最适合我的代码?Asyncore?扭曲?

我有一个我正在研究的程序,它将同时从两个"网络源"读取.我想尝试一种异步方法,而不是使用线程.这让我想知道使用哪个库...

我想出了一些简单的示例代码,它可以演示我的程序将要执行的操作:

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教程吗?

python asynchronous twisted asyncore

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

如何在python中的类中处理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 multithreading smtp asyncore

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

Python中的异步HTTP调用

我需要在Python中使用回调类功能,我多次向Web服务发送请求,每次都更改参数.我希望这些请求同时发生而不是顺序发生,所以我希望异步调用该函数.

它看起来像asyncore是我可能想要使用的,但我看到它的工作原理的例子看起来都像是矫枉过正,所以我想知道是否还有另一条道路我应该倒下.关于模块/流程的任何建议?理想情况下,我想以程序方式使用它们而不是创建类,但我可能无法绕过它.

python asynchronous asyncore

12
推荐指数
3
解决办法
2万
查看次数

urllib2和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)

python urllib2 ipv6 asyncore

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

asyncore回调启动线程......好吗?

我不熟悉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 multithreading couchdb asyncore

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

QObject(QPlainTextEdit)和多线程问题

我目前正在尝试使用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(死链接)

python multithreading qt4 pyqt4 asyncore

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

Asyncore循环和raw_input问题

我正在尝试学习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)

python loops raw-input asyncore

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

Python asyncore&dbus

是否有可能整合asyncoredbus通过相同main loop

通常,DBus集成是通过glib主循环完成的:是否可以asyncore集成这个主循环或者使用dbus asyncore

python dbus asyncore

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

如何从处理程序退出asyncore调度程序?

我在文档中找不到这个,但是我怎么打算在asyncore.loop()不使用信号的情况下突破?

python asyncore

6
推荐指数
3
解决办法
6622
查看次数

从asyncore过渡到asyncio

我正在尝试从过渡asyncoreasyncio从我将一些旧代码从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 python-3.x python-asyncio macos-sierra

6
推荐指数
0
解决办法
469
查看次数