小编The*_*len的帖子

PyCharm 中的分析模块

跟进这个问题: 创建一个运行模块的 PyCharm 配置“python -m foo”

使用 2018.1 中的新选项,运行和调试模块对我来说非常有用,您现在可以为其指定要运行的模块。但是,分析相同的配置不起作用。

PyCharm 尝试运行这样的东西:

/path/to/python /path/to/pycharm/plugins/python/helpers/profiler/run_profiler.py 127.0.0.1 44725 -m mypackage.cli.runthis paramA paramB
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,所有参数(尤其是 -m)都转发到我的包,并且 argparse 抱怨它不知道 -m。正如我之前所说,此配置非常适合运行/调试。知道如何让分析器工作吗?

python profiling pycharm

7
推荐指数
0
解决办法
205
查看次数

Windows中的asyncio循环的add_signal_handler()

我目前正在将一个Python项目从Linux移植到Windows(使用Anaconda Python 3.6).一切都很完美,我无法正常退出asyncio循环工作.

在Linux中我正在做以下事情:

class GracefulExit(SystemExit):
    code = 1

def raise_graceful_exit():
    raise GracefulExit()

loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGINT, raise_graceful_exit)
loop.add_signal_handler(signal.SIGTERM, raise_graceful_exit)

try:
    loop.run_forever()
except GracefulExit:
    pass

shutdown()
Run Code Online (Sandbox Code Playgroud)

在Windows中,不幸的是我得到NotImplementedErroradd_signal_handler.如果没有这个,我当然永远不会有机会彻底关闭程序.

关于如何解决这个问题的任何想法?谢谢.

python windows

5
推荐指数
2
解决办法
1722
查看次数

Python中的多线程asyncio

我目前正在使用Python 3.5中的asyncio执行我的第一步,并且有一个问题困扰着我.显然我还没有完全理解协程......

这是我正在做的简化版本.

在我的类中,我有一个open()方法,可以创建一个新线程.在该线程中,我创建了一个新的事件循环和一些主机的套接字连接.然后我让循环永远运行.

def open(self):
    # create thread
    self.thread = threading.Thread(target=self._thread)
    self.thread.start()
    # wait for connection
    while self.protocol is None:
        time.sleep(0.1)

def _thread(self):
    # create loop, connection and run forever
    self.loop = asyncio.new_event_loop()
    coro = self.loop.create_connection(lambda: MyProtocol(self.loop),
                                       'somehost.com', 1234)
    self.loop.run_until_complete(coro)
    self.loop.run_forever()
Run Code Online (Sandbox Code Playgroud)

停止连接现在非常简单,我只是从主线程停止循环:

loop.call_soon_threadsafe(loop.stop)
Run Code Online (Sandbox Code Playgroud)

不幸的是我需要做一些清理工作,特别是在断开与服务器的连接之前我需要清空一个队列.所以我尝试了MyProtocol中的这个stop()方法:

class MyProtocol(asyncio.Protocol):
    def __init__(self, loop):
        self._loop = loop
        self._queue = []

    async def stop(self):
        # wait for all queues to empty
        while self._queue:
            await asyncio.sleep(0.1)
        # disconnect
        self.close()
        self._loop.stop()
Run Code Online (Sandbox Code Playgroud)

队列从协议的data_received()方法中清空,所以我只想等待使用带有asyncio.sleep()调用的while循环.然后我关闭连接并停止循环.

但是如何从主线程调用此方法并等待它?我尝试了以下,但它们似乎都没有工作(协议是当前使用的MyProtocol实例):

loop.call_soon_threadsafe(protocol.stop)
loop.call_soon_threadsafe(functools.partial(asyncio.ensure_future, protocol.stop(), loop=loop)) …
Run Code Online (Sandbox Code Playgroud)

multithreading python-asyncio

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