3

私はデュアルクアッドコアマシンを持っています。だから、私のためのCPUリストは0-7です。

Pythonからタスクセットを実行しようとしています

mapping = [2,2,2,2,2]
for i in range(0,len(mapping)):
        cmd = "taskset -c" +  str(mapping[r]) + "python <path>/run-apps.py" + thr[r] + "&"
        os.system(cmd)

そしてそれは言う:

taskset: invalid option -- '2'
taskset (util-linux-ng 2.17.2)
usage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]
set or get the affinity of a process

  -p, --pid                  operate on existing given pid
  -c, --cpu-list             display and specify cpus in list format
  -h, --help                 display this help
  -V, --version              output version information

The default behavior is to run a new command:
  taskset 03 sshd -b 1024
You can retrieve the mask of an existing task:
  taskset -p 700
Or set it:
  taskset -p 03 700
List format uses a comma-separated list instead of a mask:
  taskset -pc 0,3,7-11 700
Ranges in list format can take a stride argument:
  e.g. 0-31:2 is equivalent to mask 0x55555555

しかし、コア2は利用可能であり、私はから同じことを実行することになっていcommandlineます。

taskset -c 2 python <path>/run-apps.py lbm &

問題が何であるかについての手がかりではありません。

ヒントはありますか?

4

3 に答える 3

5

タスクセットの呼び出しを避け、代わりにpsutilを使用できます: https ://pythonhosted.org/psutil/#psutil.Process.cpu_affinity

>>> import psutil
>>> psutil.cpu_count()
4
>>> p = psutil.Process()
>>> p.cpu_affinity()  # get
[0, 1, 2, 3]
>>> p.cpu_affinity([0])  # set; from now on, process will run on CPU #0 only
>>> p.cpu_affinity()
[0]
>>>
>>> # reset affinity against all CPUs
>>> all_cpus = list(range(psutil.cpu_count()))
>>> p.cpu_affinity(all_cpus)
>>>
于 2016-11-29T01:43:57.290 に答える
3

投稿したコマンドラインと比較すると、いくつかのスペースが不足しています...例:

cmd = "taskset -c " +  str(mapping[r]) + " python <path>/run-apps.py " + thr[r] + " &"

あなたのコードでは、「コマンドライン」を解析するときに、多くのコマンドライン解析ライブラリによると、表示されているエラーを説明するのと同じtaskset文字列が表示されます。-c2-c -2

代わりに文字列補間を使用すると、次のことが読みやすくなる場合があります。

cmd = "taskset -c %s python <path>/run-apps.py %s &" % (mapping[r],thr[r])

または新しいスタイル.format

cmd = "taskset -c {0} python <path>/run-apps.py {1} &".format(mapping[r],thr[r])

そして最後に、少なくともpythonモジュールos.systemについての言及がなければ、を使用した解決策はありません。subprocess

process = subprocess.Popen(['taskset',
                            '-c',
                            str(mapping[r]),
                            'python',
                            '<path>/run-apps.py',
                            str(thr[r]) ] )

シェルを完全に回避します。これにより、わずかに効率が向上し、シェルインジェクションタイプの攻撃からより安全になります。

于 2013-02-05T20:53:22.143 に答える
0

スペースが足りません。自分自身を助けるために、以下を試してください:

  1. os.system()行をコメントアウトします
  2. os.system()行の下に、次を追加します。

    印刷コマンド

コマンドラインがどのように表示されるかがわかります。必要に応じてスペースを追加します。次に、os.system()行のコメントを解除します。

于 2013-02-05T21:01:32.943 に答える