如何在上下文切换之前强制 python 命令一起运行?



我有 2 个进程正在运行,每个进程都在打印它拥有的配置文件。配置文件没有我可以跟踪的唯一数据,所以我无法知道哪个进程打印了什么。

我处理这个问题的方法是添加前缀打印:

def print_config(proc_name):
print(proc_name)
print_conf()
# both processes are given the target print_config,
# args='a' or 'b', and then are started

但是,操作系统按以下顺序对命令进行排序:

1. Proc A: print(proc_name)
2. Proc B: print(proc_name)
3. Proc ?: print_conf()
4. Proc ??: print_conf()

如何组合打印件,以便我将看到打印件(proc_name(并在print_conf后立即看到?

您可以使用锁定对象来控制线程的执行。基本上,原理是在打印之前锁定一个全局对象,并在完成打印时释放它,以便其他线程可以访问它并连续锁定它并自己进行打印。下面是其中一个示例(取自 bogotobogo.com(:

import threading
import time
import logging
import random
logging.basicConfig(level=logging.DEBUG,
format='(%(threadName)-9s) %(message)s',)
class Counter(object):
def __init__(self, start = 0):
self.lock = threading.Lock()
self.value = start
def increment(self):
logging.debug('Waiting for a lock')
self.lock.acquire()
try:
logging.debug('Acquired a lock')
self.value = self.value + 1
finally:
logging.debug('Released a lock')
self.lock.release()
def worker(c):
for i in range(2):
r = random.random()
logging.debug('Sleeping %0.02f', r)
time.sleep(r)
c.increment()
logging.debug('Done')
if __name__ == '__main__':
counter = Counter()
for i in range(2):
t = threading.Thread(target=worker, args=(counter,))
t.start()
logging.debug('Waiting for worker threads')
main_thread = threading.currentThread()
for t in threading.enumerate():
if t is not main_thread:
t.join()
logging.debug('Counter: %d', counter.value)

更新:

此外,如果您不询问锁定线程,那么实际上操作两个独立脚本的输出,概念是完全相同的,除了您可以使用锁定文件来实现此目的。假设您有两个非常相似的脚本: 第一个:

import os.path
while(os.path.exists("lock.LCK")):
continue

f = open("lock.LCK", "w+")
file_for_output = open("output.txt", "a")
file_for_output.write("Hi2n")
file_for_output.write("There2n")
f.close()
os.remove("lock.LCK")
file_for_output.close()

还有一个:

import os.path
while(os.path.exists("lock.LCK")):
continue

f = open("lock.LCK", "w+")
file_for_output = open("output.txt", "a")
file_for_output.write("Hi1n")
file_for_output.write("There1n")
f.close()
os.remove("lock.LCK")
file_for_output.close()

如果您同时运行这两个文件,则 1 个文件必须等到另一个文件完成写入,因为锁定文件保护处于 dead while 循环中。请注意,这只是如何处理此问题的基本示例。如果你想在实际代码中实现这一点,我真的建议为死循环和适当的异常设置超时限制。

相关内容

  • 没有找到相关文章