小编knu*_*ole的帖子

如何在python(tornado)中运行websocket循环外的函数

我正在尝试通过websockets建立一个公共Twitter流的小例子.这是我的websocket.py,它正在运行.

我想知道的是:我如何从类WSHandler的"外部"与websocket进行交互(即,不仅仅是在收到来自websocket.js的消息时回答)?假设我想在同一个脚本中运行一些其他函数来发布"你好!" 每隔五秒钟将其发送到websocket(浏览器),而无需客户端的任何交互.我怎么能这样做?

因此,我认为这是一个基本的初学者问题,关于如何处理下面的类.任何方向的任何指针将不胜感激!

import os.path
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

# websocket
class FaviconHandler(tornado.web.RequestHandler):
    def get(self):
        self.redirect('/static/favicon.ico')

class WebHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("websockets.html")

class WSHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print 'new connection'
        self.write_message("Hi, client: connection is made ...")

    def on_message(self, message):
        print 'message received: \"%s\"' % message
        self.write_message("Echo: \"" + message + "\"")
        if (message == "green"):
            self.write_message("green!")

    def on_close(self):
        print 'connection closed'



handlers = [
    (r"/favicon.ico", FaviconHandler),
    (r'/static/(.*)', tornado.web.StaticFileHandler, {'path': 'static'}),
    (r'/', WebHandler),
    (r'/ws', WSHandler),
]

settings = …
Run Code Online (Sandbox Code Playgroud)

python tornado websocket

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

如何调试Python内存故障?

编辑:非常感谢找到错误的帮助 - 但由于它可能很难找到/重现,任何一般调试帮助也将非常感谢!帮帮我自己!=)

编辑2:缩小范围,评论代码.

编辑3:似乎lxml可能不是罪魁祸首,谢谢!完整的脚本在这里.我需要重温它寻找参考.他们看起来怎么样?

编辑4:实际上,脚本在此 部分停止(100%)parse_og .所以编辑3是假的 - 它必须以某种方式lxml.

编辑5主要编辑:正如下面的David Robinson和TankorSmash所建议的那样,我发现了一种datalxml.etree.HTML( data )在狂野循环中发送的内容.(我不小心忽略了它,但发现我的罪孽被赎回了,因为我付出了额外两天调试的价格!) 工作崩溃的脚本在这里. (还开了一个新问题.)

编辑6:原来这是lxml版本2.7.8及更低版本(至少)的错误.更新到lxml 2.9.0,错误消失了.还要感谢这个后续问题的优秀人士.

我不知道如何调试我遇到的这个奇怪的问题.下面的代码运行正常大约五分钟,当RAM突然完全填满时(在100%期间从200MB到1700MB - 然后当内存已满时,它进入蓝色等待状态).

这是由于下面的代码,特别是前两行.这是肯定的.但是发生了什么?有什么可能解释这种行为?

def parse_og(self, data):
    """ lxml parsing to the bone! """
    try:
        tree = etree.HTML( data ) # << break occurs on this line >>
        m = tree.xpath("//meta[@property]")

        #for i in m:
        #   y = i.attrib['property']
        #   x = i.attrib['content']
        #   # self.rj[y] = x  # …
Run Code Online (Sandbox Code Playgroud)

python memory debugging lxml

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

如何查询 CosmosDB 的嵌套对象值

order_id = 9234029m考虑到 CosmosDB 中的此文档,如何检索匹配的对象:

{
    "order": {
        "order_id": "9234029m",
        "order_name": "name",
    }
}

Run Code Online (Sandbox Code Playgroud)

我尝试在 CosmosDB 数据资源管理器中查询,但不可能order_id像这样简单地查询嵌套对象:

{
    "order": {
        "order_id": "9234029m",
        "order_name": "name",
    }
}

Run Code Online (Sandbox Code Playgroud)

(错误:“语法错误,‘订单’附近的语法不正确”)

这看起来应该是这么简单,但事实并非如此!(在 CosmosDB 数据资源管理器中,所有查询都需要以 开头SELECT * FROM c,但 REST SQL 也是一种替代方案。)

azure azure-cosmosdb azure-cosmosdb-sqlapi

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

在没有等待答案的情况下关闭功能(Python)

我有一串链接进来,我想不时检查它们rss.但是当我关闭我的get_rss()功能时,它会阻塞并且流停止.这是不必要的,我想要忘掉这个get_rss()函数(它将结果存储在其他地方.)

我的代码是这样的:

self.ff.get_rss(url)    # not async
print 'im back!'

(...)

def get_rss(url):
    page = urllib2.urlopen(url)     # not async
    soup = BeautifulSoup(page)
Run Code Online (Sandbox Code Playgroud)

我想如果我可以点击并忘记第一次通话,那么我甚至可以使用urllib2而不用担心它不是异步.任何帮助深表感谢!

编辑:尝试gevent,但像这样没有任何反应:

print 'go'
g = Greenlet.spawn(self.ff.do_url, url)
print g
print 'back'

# output: 
go
<Greenlet at 0x7f760c0750f0: <bound method FeedFinder.do_url of <rss.FeedFinder object at 0x2415450>>(u'http://nyti.ms/SuVBCl')>
back
Run Code Online (Sandbox Code Playgroud)

Greenlet似乎已注册,但该功能self.ff.do_url(url)似乎根本没有运行.我究竟做错了什么?

python asynchronous tornado pycurl

7
推荐指数
2
解决办法
3733
查看次数

在巨大的关键字列表中检查单词的最快方法 - Python性能

感谢您惊人的快速反应.Stackoverflow太棒了!

我需要检查一个单词(或者更确切地说是数千个)是否与包含关键字的dict相匹配.

例如,假设我有一个字符串:"The fluffy fox jumped the friggin fence." 我需要根据关键字的dict检查字符串的每个单词,如果匹配,则返回所有值.

我创建了一个字典filters:( uniqueid表示即"lk2m3lk4m2",休息是'静态'.)

filters:
        { "fox" : [
                    { 'subscription' : 'uniqueid', 'link' : 'uniqueid' },
                    { 'subscription' : 'uniqueid', 'link' : 'uniqueid' }
                  ]},

        { "fence" : [
                      { 'subscription' : 'uniqueid', 'link' : 'uniqueid' }
                    ]}
Run Code Online (Sandbox Code Playgroud)

...并计划迭代字符串中每个单词的过滤器(我必须以大约5000字/秒的速度执行此操作.换句话说,性能是问题所有.

过滤关键字的数量可能会增加到数千,而字符串永远不会超过正常的句子长(即5-20个字).因此,我将迭代字符串中的每个单词,并检查它是否包含在filter-list中.然而,在500句/秒,我仍然在看很多计算.

例如,是否可以对列表进行排序(即列表中的dict键),从而大幅提高性能?是否有我应该使用的C实现(就像我使用cjson具有很好的性能提升)?

对不起有点流动的问题 - 但我应该怎么做这个任务?

编辑:

预期输入:
"The fluffy fox jumped the friggin fence."
预期输出:(
{ 'subscription' : 'flskdmfslk32232', 'link' : 'sfdksmfls22323' }, { 'subscription' : '3023940fsdf', 'link' …

python performance search

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

在不下载整个图像的情况下获取EXIF数据-Python

仅下载EXIF数据就能远程获取图像的EXIF信息吗?

根据我对图像文件中EXIF字节的了解,EXIF数据位于图像的前几个字节中。

因此,问题是如何使用Python仅下载远程文件的前几个字节?(编辑:仅靠HTTP Range Header不够好,因为并非所有远程主机都支持它,在这种情况下将进行完全下载。)

例如,可以在x字节的进度后取消下载吗?

python exif client-server image download

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

在OSX中搜索和销毁Rouge进程

信息:我前几天安装了SymformSync,一个分布式云存储系统,但当天再次删除它.(我喜欢这个想法,但它不适合像我这样的笔记本电脑上的人.)但是,有一个进程symformsync不断弹出并在CPU上消耗很多.我删除了应用程序,但这个过程仍然不断弹出!毋庸置疑,我不理解我无法控制自己CPU上的进程!

问:如何找到自动启动的过程,如何删除它?

macos process

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

在 Tweepy 和 Tornado WebSocket 中的类之间传递数据

我有两个主要模块,Tornado WebSocket 和 Tweepy Streaming,我试图让它们相互通信。

on_status在下面的 Tweepy 类中StdOutListener(用 标记<--),我想WSHandler.on_message更高层调用 Tornado 类,数据从 传递on_status

但是,我无法这样做,因为我使用下面的代码收到与未定义实例等相关的错误消息。非常感谢任何帮助!

(另外,我设法同时运行两个模块的唯一非阻塞方式是使用线程,因为它IOLoop.add_callback不会阻止StdOutListener阻塞。我很想知道为什么或者是否推荐这种实现。谢谢!)

import os.path
import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web
import threading
import time
import datetime

# websocket
class FaviconHandler(tornado.web.RequestHandler):
    def get(self):
        self.redirect('/static/favicon.ico')

class WebHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("websockets.html")

class WSHandler(tornado.websocket.WebSocketHandler):
    def open(self): 
        cb = tornado.ioloop.PeriodicCallback(self.spew, 1000, io_loop=main_loop)
        cb.start()
        print 'new connection'
        self.write_message("Hi, client: connection is made ...")

    def on_message(self, message):
        print 'message received: …
Run Code Online (Sandbox Code Playgroud)

python tornado websocket tweepy

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