小编red*_*moc的帖子

如何在 Python 中使用 Ctrl+C 中止从队列中提取项目的线程

我已经使用 python 实现了一些线程应用程序。在运行时我想捕获 CTRL+C sigcall 并退出程序。为此,我注册了一个名为 exit_graceively 的函数,该函数还负责以更受控的方式停止线程。然而,它似乎不起作用。看来处理程序从未被调用过

这是我正在使用的示例:

import Queue
import threading
import signal
import sys
import time

queue = Queue.Queue()
workers = list()

def callback(id, item):
    print("{}: {}".format(id, item))
    time.sleep(1)

def exit_gracefully(signum, frame):
    print("Ctrl+C was pressed. Shutting threads down ...")
    print("Stopping workers ...")
    for worker in workers:
        worker.stop()
    sys.exit(1)


class ThreadedTask(threading.Thread):
    def __init__(self, id, queue, callbacks):
        threading.Thread.__init__(self)
        self._stop_event = threading.Event()
        self.id = str(id)
        self.queue = queue
        self.callbacks = callbacks
        self._stopped = False

    def run(self):
        while not self.stopped():
            item …
Run Code Online (Sandbox Code Playgroud)

python queue multithreading python-2.7

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

xslt条件增量

我在某些条件下增加计数器时遇到问题.

输入:

<Users>
  <User>
    <id>1</id>
    <username>jack</username>
  </User>
  <User>
    <id>2</id>
    <username>bob</username>
  </User>
  <User>
    <id>3</id>
    <username>bob</username>
  </User>
  <User>
    <id>4</id>
    <username>jack</username>
  </User>
</Users>
Run Code Online (Sandbox Code Playgroud)

想要输出:

<Users>
  <User>
    <id>1</id>
    <username>jack01</username>
  </User>
  <User>
    <id>2</id>
    <username>bob01</username>
  </User>
  <User>
    <id>3</id>
    <username>bob02</username>
  </User>
  <User>
    <id>4</id>
    <username>jack02</username>
  </User>
</Users>
Run Code Online (Sandbox Code Playgroud)

要完成此操作,可以使用以下算法:

  • 按用户名排序输入
  • 为每个用户
    • 当以前的用户名等于当前用户名时
      • 增量计数器和
      • 将用户名设置为'$ username $ counter'
    • 除此以外
      • 将计数器设为1
  • (再次按id排序 - 不是必需的)

所以我试图将其转换为XSLT:

  <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="Users">
    <Users>
    <xsl:apply-templates select="create_user">
      <xsl:sort select="User/username"/>
    </xsl:apply-templates>
    </Users>
  </xsl:template>

  <xsl:template match="create_user">
    <id><xsl:value-of select="id"/></id>
    <xsl:choose>
      <xsl:when test="username=(preceding-sibling::User[1]//username)">
        <xsl:variable name="count"> …
Run Code Online (Sandbox Code Playgroud)

sorting xslt conditional templates increment

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