我遇到了在包的模块中导入__init__.py和使用import as绝对导入的问题.
我的项目有一个子包,在其中__init__.py我将一个类从一个模块"提升"到带有from import as语句的子包级别.该模块使用绝对导入从该子包导入其他模块.我收到这个错误AttributeError: 'module' object has no attribute 'subpkg'.
结构:
pkg/
??? __init__.py
??? subpkg
? ??? __init__.py
? ??? one.py
? ??? two_longname.py
??? tst.py
Run Code Online (Sandbox Code Playgroud)
pkg/__ init__.py为空.
pkg/subpkg/__ init__.py:
from pkg.subpkg.one import One
Run Code Online (Sandbox Code Playgroud)
pkg/subpkg/one.py:
import pkg.subpkg.two_longname as two
class One(two.Two):
pass
Run Code Online (Sandbox Code Playgroud)
pkg/subpkg/two_longname.py:
class Two:
pass
Run Code Online (Sandbox Code Playgroud)
pkg/tst.py:
from pkg.subpkg import One
print(One)
Run Code Online (Sandbox Code Playgroud)
输出:
$ python3.4 -m pkg.tst
Traceback (most recent …Run Code Online (Sandbox Code Playgroud) 我想用同步stop()方法实现一个线程.
我见过这样的版本:
class Thread1:
def __init__(self):
self._stop_event = threading.Event()
self._thread = None
def start(self):
self._thread = threading.Thread(target=self._run)
self._thread.start()
def stop(self):
self._stop_event.set()
self._thread.join()
def _run(self):
while not self._stop_event.is_set():
self._work()
def _work(self):
print("working")
Run Code Online (Sandbox Code Playgroud)
但我已经读过原子操作是线程安全的,在我看来它可以在没有的情况下完成Event.所以我想出了这个:
class Thread2:
def __init__(self):
self._working = False
self._thread = None
def start(self):
self._working = True
self._thread = threading.Thread(target=self._run)
self._thread.start()
def stop(self):
self._working = False
self._thread.join()
def _run(self):
while self._working:
self._work()
def _work(self):
print("working")
Run Code Online (Sandbox Code Playgroud)
它认为在C中类似的实现被认为是不正确的,因为编译器可以放入_working寄存器(甚至优化),工作线程永远不会知道变量已经改变.可以在Python中发生类似的事情吗?这个实现是否正确?我的目的不是完全避免事件或锁定,只是想了解这个原子操作的事情.
有一篇文章“跟踪每个版本”讲述了在每个代码部署的图表上显示一条垂直线。他们正在使用石墨。我想用 Prometheus 2.2 和 Grafana 5.1 做类似的事情。更具体地说,我想在图表上显示一个“应用程序启动”事件。
Grafana 注释似乎是合适的机制,但我无法弄清楚要使用哪种类型的普罗米修斯指标以及如何查询它。