小编Dan*_* S.的帖子

Python多处理锁

此多处理代码按预期工作.它创建了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)

python multiprocessing

17
推荐指数
3
解决办法
3万
查看次数

Chrome扩展程序背景页面和内容脚本同步

假设我在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,但我的问题更通用,因为我在后台页面中有额外的异步处理.目前,我的内容脚本检查后台页面以确保一切准备就绪(使用间隔继续检查),但我不确定是否需要进行此类检查.

javascript google-chrome-extension

5
推荐指数
1
解决办法
577
查看次数

如何使用中断触发 x86 程序集中的除零错误异常?

我正在尝试了解 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 指令相同的错误?

linux assembly

5
推荐指数
1
解决办法
943
查看次数

为什么 x86 汇编函数的 GDB 断点设置在错误的地址?

我遇到了一个问题,即在添加断点时 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)

linux debugging x86 assembly gdb

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