此多处理代码按预期工作.它创建了4个Python进程,并使用它们打印数字0到39,每次打印后都会有延迟.
import multiprocessing
import time
def job(num):
print num
time.sleep(1)
pool = multiprocessing.Pool(4)
lst = range(40)
for i in lst:
pool.apply_async(job, [i])
pool.close()
pool.join()
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用multiprocessing.Lock来防止多个进程从打印到标准输出时,程序只是立即退出而没有任何输出.
import multiprocessing
import time
def job(lock, num):
lock.acquire()
print num
lock.release()
time.sleep(1)
pool = multiprocessing.Pool(4)
l = multiprocessing.Lock()
lst = range(40)
for i in lst:
pool.apply_async(job, [l, i])
pool.close()
pool.join()
Run Code Online (Sandbox Code Playgroud)
为什么引入multiprocessing.Lock会使这段代码不起作用?
更新:当全局声明锁时(我在那里做了一些非确定性测试以检查锁是否正常),而不是上面的代码将锁作为参数传递(Python的多处理文档显示锁被传递为参数).下面的代码具有全局声明的锁,而不是在上面的代码中作为参数传递.
import multiprocessing
import time
l = multiprocessing.Lock()
def job(num):
l.acquire()
print num
l.release()
time.sleep(1)
pool = multiprocessing.Pool(4)
lst = range(40)
for i in …Run Code Online (Sandbox Code Playgroud) 假设我在Chrome扩展程序的后台页面中有以下代码.
var opts;
chrome.storage.local.get(options, function(result) {
opts = result[options];
});
chrome.runtime.onMessage.addListener(function(request, sender, response) {
if (request.message === 'getOpts')
response(opts);
});
Run Code Online (Sandbox Code Playgroud)
在我的内容脚本中,我opts通过消息传递进行访问.
chrome.runtime.sendMessage({'message': 'getOpts'}, function(response) {
console.log(opts);
});
Run Code Online (Sandbox Code Playgroud)
是否有保证在内容脚本运行之前定义opts?例如,在启动浏览器时,后台页面将会运行,并且可能chrome.storage.local.get会将回调添加到后台页面的消息队列中.Chrome会在注入内容脚本之前完成对该队列的处理吗?
我可以从内容脚本中调用chrome.storage.local.get,但我的问题更通用,因为我在后台页面中有额外的异步处理.目前,我的内容脚本检查后台页面以确保一切准备就绪(使用间隔继续检查),但我不确定是否需要进行此类检查.
我正在尝试了解 x86 程序集中的中断。
我试图触发一个被零除错误,它对应于代码 0。
int $0
Run Code Online (Sandbox Code Playgroud)
我期望这与除以零具有相同的行为。
movl $0, %edx # dividend
movl $0, %eax # dividend
movl $0, %edi # divisor
divl %edi
Run Code Online (Sandbox Code Playgroud)
在前一种情况下,我的程序在 Linux 上因“分段错误”和退出代码 139 而崩溃。在后一种情况下,我的程序因“浮点异常”而崩溃,并在 Linux 上退出代码 136。
如何使用中断触发与使用零除数调用 div 指令相同的错误?
我遇到了一个问题,即在添加断点时 gdb 将行号映射到错误的内存地址。
以下 x86 Linux 汇编程序打印“hello”。
/* hello.s */
.section .data
str:
.ascii "hello\n"
strlen = . - str
.section .text
print:
pushl %ebp
movl %esp, %ebp
pushl %ebx
movl $4, %eax
movl $1, %ebx
movl $str, %ecx
movl $strlen, %edx
int $0x80
popl %ebx
movl %ebp, %esp
popl %ebp
ret
.globl _start
_start:
call print
movl $1, %eax
movl $0, %ebx
int $0x80
Run Code Online (Sandbox Code Playgroud)
我用调试信息编译它,然后链接。
$ as -g --32 -o hello.o hello.s
$ ld -m elf_i386 -o hello hello.o …Run Code Online (Sandbox Code Playgroud)